377 Stimmen

Initialisierung von C++-Strukturen

Ist es möglich, Structs in C++ wie unten angegeben zu initialisieren:

struct address {
    int street_no;
    char *street_name;
    char *city;
    char *prov;
    char *postal_code;
};

address temp_address = { .city = "Hamilton", .prov = "Ontario" };

Die Links aquí y aquí erwähnen, dass es nur in C möglich ist, diesen Stil zu verwenden. Wenn ja, warum ist dies in C++ nicht möglich? Gibt es einen technischen Grund, warum es nicht in C++ implementiert ist, oder ist es schlechte Praxis, diesen Stil zu verwenden. Ich verwende diese Art der Initialisierung gerne, weil meine Struktur groß ist und dieser Stil mir eine klare Lesbarkeit gibt, welcher Wert welchem Element zugewiesen ist.

Bitte teilen Sie mir mit, ob es andere Möglichkeiten gibt, die gleiche Lesbarkeit zu erreichen.

Ich habe die folgenden Links gelesen, bevor ich diese Frage gestellt habe:

  1. C/C++ für AIX
  2. C Strukturinitialisierung mit Variable
  3. Statische Strukturinitialisierung mit Tags in C++
  4. C++11 Richtige Strukturinitialisierung

237voto

Wyzard Punkte 32772

Wenn Sie deutlich machen wollen, was jeder Initialisierungswert ist, teilen Sie ihn einfach auf mehrere Zeilen auf, mit einem Kommentar in jeder Zeile:

address temp_addres = {
  0,  // street_no
  nullptr,  // street_name
  "Hamilton",  // city
  "Ontario",  // prov
  nullptr,  // postal_code
};

131voto

Gui13 Punkte 12487

Nach meine Frage zu keinem befriedigenden Ergebnis führte (weil C++ kein Tag-basiertes Init für Strukturen implementiert), habe ich den Trick angewendet, den ich hier gefunden habe: Werden die Mitglieder einer C++-Struktur standardmäßig mit 0 initialisiert?

Für Sie würde es darauf hinauslaufen, das zu tun:

address temp_address = {}; // will zero all fields in C++
temp_address.city = "Hamilton";
temp_address.prov = "Ontario";

Dies kommt sicherlich dem am nächsten, was Sie ursprünglich wollten (alle Felder außer denen, die Sie initialisieren wollen, auf Null setzen).

60voto

sameer chaudhari Punkte 908

Wie bereits von anderen erwähnt, handelt es sich hierbei um einen designierten Initialisierer.

Diese Funktion ist Teil von C++20

25voto

Gene Punkte 44687

Die Feldbezeichner sind in der Tat C-Initialisierungssyntax. In C++ geben Sie einfach die Werte in der richtigen Reihenfolge ohne die Feldnamen an. Leider bedeutet dies, dass Sie alle Werte angeben müssen (eigentlich können Sie Felder mit Nullwerten am Ende weglassen und das Ergebnis ist dasselbe):

address temp_address = { 0, 0, "Hamilton", "Ontario", 0 };

20voto

Dieses Merkmal wird als benannte Initialisierer . Es handelt sich um einen Zusatz zum C99-Standard. In C++11 wurde diese Funktion jedoch nicht aufgenommen. Gemäß The C++ Programming Language, 4th edition, Abschnitt 44.3.3.2 (C Features Not Adopted by C++):

Einige Ergänzungen zu C99 (im Vergleich zu C89) wurden absichtlich nicht in C++ übernommen:

[1] Arrays mit variabler Länge (VLAs); Verwendung von Vektoren oder einer Form von dynamischen Arrays

[2] Bezeichnete Initialisierer; Konstruktoren verwenden

Die C99-Grammatik hat die benannte Initialisierer [Siehe ISO/IEC 9899:2011, N1570 Committee Draft - April 12, 2011]

6.7.9 Initialisierung

initializer:
    assignment-expression
    { initializer-list }
    { initializer-list , }
initializer-list:
    designation_opt initializer
    initializer-list , designationopt initializer
designation:
    designator-list =
designator-list:
    designator
    designator-list designator
designator:
    [ constant-expression ]
    . identifier

Auf der anderen Seite verfügt C++11 nicht über die benannte Initialisierer [Siehe ISO/IEC 14882:2011, N3690 Committee Draft - May 15, 2013]

8.5 Initialisierer

initializer:
    brace-or-equal-initializer
    ( expression-list )
brace-or-equal-initializer:
    = initializer-clause
    braced-init-list
initializer-clause:
    assignment-expression
    braced-init-list
initializer-list:
    initializer-clause ...opt
    initializer-list , initializer-clause ...opt
braced-init-list:
    { initializer-list ,opt }
    { }

Um den gleichen Effekt zu erzielen, verwenden Sie Konstruktoren oder Initialisierungslisten:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X