2010-10-26 20 views
10

Ich verdiene immer noch meine C++ - Flügel; Meine Frage ist, wenn ich eine Struktur wie so haben:C++ initialisiert anonyme Struktur

struct Height 
{ 
    int feet; 
    int inches; 
}; 

Und ich habe dann ein paar Zeilen wie folgt:

Height h = {5, 7}; 
Person p("John Doe", 42, "Blonde", "Blue", h); 

Ich mag die Initialisierung von Strukturen über geschweifte Klammern, aber ich würde es vorziehen, die oben in einer Zeile, in einer anonymen Height-Struktur. Wie mache ich das? Mein erster naiver Ansatz war:

Person p("John Doe", 42, "Blonde", "Blue", Height{5,7}); 

Dies allerdings nicht funktionierte. Bin ich sehr weit daneben?

+4

Dies ist nur ein Beispiel sein kann, aber, ist es wahrscheinlich besser, die 'Height' als einzelnes' inches' Feld zu speichern. Wenn du Füße brauchst, kannst du das in Füße umwandeln; es ist einfach viel einfacher, mit einer einzelnen Einheit umzugehen, als mit mehreren Einheiten zu jonglieren, besonders da es jetzt mehrere Werte geben kann, die gleich sind, aber nicht die gleiche Darstellung haben (zB '{2, 3}' und '{ 1, 15} '). –

+1

C++ 1x kommt mit [uniform initialization syntax] (http://en.wikipedia.org/wiki/C%2B%2B0x#Uniform_initialization), die so etwas unterstützen würde. Es ist sehr wahrscheinlich, dass Ihr Compiler dies bereits unterstützt. – sbi

+2

Geben Sie anstelle von 'Height {5,7}' im Person-Konstruktor '(struct Height) {5,7} 'an (wenn Sie als Referenz übergeben werden) (oder' & (struct Height) {5,7} 'wenn Sie einen Zeiger übergeben. Sie übertragen die Initialisierungsliste im Grunde auf den gewünschten Typ. Es ist eine C99 + -Funktion, sollte aber auch mit C++ nutzbar sein. – Erhhung

Antwort

15

Sie können nicht, zumindest nicht in der heutigen C++; Die Klammerinitialisierung ist Teil der Initialisierungssyntax und kann nicht an anderer Stelle verwendet werden.

Sie können einen Konstruktor Height hinzufügen:

struct Height 
{ 
    Height(int f, int i) : feet(f), inches(i) { } 
    int feet, inches; 
}; 

Diese Sie verwenden können:

Person p("John Doe", 42, "Blonde", "Blue", Height(5, 7)); 

Leider seit Height nicht mehr ist ein Aggregat, können Sie nicht mehr die Klammer Initialisierung verwenden . Die Initialisierung des Konstruktoraufrufs ist jedoch genauso einfach:

+0

Ordentlich. Ich wusste nicht, dass Strukturen Konstruktoren/Initialisierungslisten haben könnten. –

+10

@byte: Eine 'Struktur' ist genau das gleiche wie eine' Klasse'. Der einzige Unterschied besteht darin, dass die Basisklassen und Mitglieder standardmäßig für eine "struct" und private für eine "class" öffentlich sind. –

4

Standard C++ (C++ 98, C++ 03) unterstützt dies nicht.

g ++ unterstützt ist eine Spracherweiterung, und ich erinnere mich, dass C++ 0x wird es unterstützen. Sie müssten die Syntax der Spracherweiterung g ++ und/oder möglicherweise C++ 0x überprüfen.

Für aktuelle C++, benennen Sie einfach die Height Instanz, wie Sie bereits getan haben, dann verwenden Sie den Namen.

Beifall & hth.,

+0

Wird es automatisch bereitgestellt, oder müssen Sie einen Konstruktor definieren, der das Argument 'initializer_list' akzeptiert? –

+0

@Ben: Nein, Sie müssen keinen Konstruktor definieren, um die C++ 0x-Syntax zu erhalten. Viel von dem Punkt/Ziel ist es, eine * einheitliche * Syntax zu haben, die in fast jeder Situation gleich funktioniert. Schauen Sie sich die [Wikipedia-Link] (http://en.wikipedia.org/wiki/C%2B%2B0x#Uniform_initialization) von @sbi früher.Oder, wenn Sie die Details möchten, ist der neueste Entwurf von den [C++ committe-Seiten] (http://www.open-std.org/jtc1/sc22/wg21/) im PDF-Format verfügbar. –

Verwandte Themen