Frage

class C 
{
public:
 C() : arr({1,2,3}) //doesn't compile
{}
    /*
    C() : arr{1,2,3} //doesn't compile either
{}
    */
private:
 int arr[3];
};

Ich glaube, der Grund dafür ist, dass Arrays nur mit = Syntax initialisiert werden können, das heißt:

int arr[3] = {1,3,4};

Fragen

  1. Wie kann ich das tun, was ich tun will (das ist, initialize ein Array in ein Konstruktor (nicht Elemente Zuweisen im Körper)). Ist es überhaupt möglich?
  2. Ist das C ++ 03-Standard sagen wir etwas Besonderes Aggregate Initialisieren (einschließlich Arrays) in Ctor initializers? Oder die Ungültigkeit des obigen Codes ist eine logische Folge von einigen anderen Regeln?
  3. Do C ++ 0x initializer Listen das Problem lösen?

P. S. Bitte erwähnen nicht Vektoren, boost :: Arrays und ihre Überlegenheit zu Arrays, die ich bin mir sehr wohl bewusst.

War es hilfreich?

Lösung

  
      
  1. Wie kann ich das tun, was ich tun möchte (das heißt, initialisieren Sie ein Array in einem Konstruktor (nicht Elemente im Körper zuweisen)). Ist es überhaupt möglich?
  2.   

Ja. Es ist mit einer Struktur, die ein Array enthält. Sie sagen, Sie schon darüber wissen, aber dann verstehe ich die Frage nicht. Auf diese Weise Sie Sie ein Array im Konstruktor, ohne Zuweisungen im Körper initialisieren. Dies ist, was boost::array tut.

  

Ist das C ++ 03-Standard sagen wir etwas Besonderes Aggregate Initialisieren (einschließlich Arrays) in Ctor initializers? Oder die Ungültigkeit des obigen Codes ist eine logische Folge von einigen anderen Regeln?

A mem-Initialisierer verwendet die direkte Initialisierung. Und die Regeln der Klausel 8 verbieten diese Art der Sache. Ich bin mir nicht ganz sicher über den folgenden Fall, aber einige Compiler es erlauben.

struct A {
  char foo[6];
  A():foo("hello") { } /* valid? */
};

Siehe diese GCC PR für weitere Details.

  

Do C ++ 0x initializer Listen das Problem lösen?

Ja, sie tun. Jedoch Ihre Syntax ungültig ist, glaube ich. Sie müssen Klammern direkt abzufeuern Liste verwenden Initialisierung

struct A {
  int foo[3];
  A():foo{1, 2, 3} { }
  A():foo({1, 2, 3}) { } /* invalid */
};

Andere Tipps

C ++ 98 keine direkte Syntax für alles zur Verfügung stellen, aber Nullstellung (oder für nicht-POD Elemente, Wert-Initialisierung) des Arrays. Für, dass Sie nur Schreib C(): arr() {}.

ich, was Roger Pate ist falsch über die angeblichen Grenzen von C ++ 0x Aggregate Initialisierung, aber ich bin zu faul, es zu sehen oder es ausprobieren, und es spielt keine Rolle, nicht wahr? Bearbeiten : Roger spricht von "C ++ 03", ich falsch verstehe es als "C ++ 0x". Sorry, Roger. ?

Ein C ++ 98 Abhilfe für Ihren aktuellen Code ist das Array in einem struct zu wickeln und es von einer statischen Konstante dieses Typs initialisieren. Die Daten haben irgendwo sowieso residieren. Aus der Manschette kann wie folgt aussehen:

class C 
{
public:
    C() : arr( arrData ) {}

private:
     struct Arr{ int elem[3]; };
     Arr arr;
     static Arr const arrData;
};

C::Arr const C::arrData = {{1, 2, 3}};

Umgehung:

template<class T, size_t N>
struct simple_array { // like std::array in C++0x
   T arr[N];
};


class C : private simple_array<int, 3> 
{
      static simple_array<int, 3> myarr() {
           simple_array<int, 3> arr = {1,2,3};
           return arr;
      }
public:
      C() : simple_array<int, 3>(myarr()) {}
};
  1. Nein, leider nicht.
  2. Sie können einfach nicht so, wie Sie wollen, da sie nicht von der Grammatik (mehr unten) erlaubt ist. Sie können nur Ctor artige Initialisierung verwenden, und, wie Sie wissen, dass für die Initialisierung jedes Element in Arrays nicht verfügbar ist.
  3. Ich glaube, so, wie sie die Initialisierung auf dem ganze Linie in vielen nützlichen Möglichkeiten verallgemeinert. Aber ich bin mir nicht sicher über die Details.

In C ++ 03, aggregieren Initialisierung gilt nur mit ähnlicher Syntax wie unten, die eine gesonderte Erklärung sein muss und paßt nicht in einem Ctor initializer.

T var = {...};

Wie wäre es

...
  C() : arr{ {1,2,3} }
{}
...

Kompiliert Geldbusse g ++ 4.8

Sie möchten ein Array von ints in Ihrem Konstruktor init? Punkt es zu einer statischen Array.

class C 
{
public:
    int *cArray;

};

C::C {
    static int c_init[]{1,2,3};
    cArray = c_init;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top