Heim > Backend-Entwicklung > C++ > Warum kann ich abgeleitete Klassenmitglieder nicht mit bestimmten Initialisierern in C 20 initialisieren?

Warum kann ich abgeleitete Klassenmitglieder nicht mit bestimmten Initialisierern in C 20 initialisieren?

Barbara Streisand
Freigeben: 2024-10-29 14:44:02
Original
456 Leute haben es durchsucht

Why Can't I Initialize Derived Class Members Using Designated Initializers in C  20?

Designierte Initialisierer in C 20: Initialisierung abgeleiteter Klassen

Designierte Initialisierer, die in C 20 eingeführt wurden, ermöglichen eine präzise Initialisierung von Klassenmitgliedern mit eine designierte Initialisierungsliste. Eine aktuelle Frage wirft jedoch Licht auf ein unerwartetes Verhalten bei abgeleiteten Klassen.

Frage:

Der folgende Code veranschaulicht das Problem:

<code class="cpp">struct Person {
    std::string name{};
    std::string surname{};
    unsigned age{};
};

struct Employee : Person {
    unsigned salary{10000};
};

int main() {
    Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // Ok
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // Doesn't compile
    Employee e2{.salary{55000}}; // Warning: missing initializer for base class
}</code>
Nach dem Login kopieren

Warum schlägt die Initialisierung von Employee mit bestimmten Initialisierern fehl und es wird eine Warnung für den fehlenden Initialisierer ausgegeben?

Antwort:

Gemäß dem C 20-Standard (9.3.1 Aggregate, S. 3), wenn bestimmte Initialisierer verwendet werden, muss jeder Bezeichner im Bezeichner ein direktes, nicht statisches Datenelement der Klasse benennen. Dies bedeutet, dass Basisklassenmitglieder nicht mit bestimmten Initialisierern initialisiert werden können.

Daher ist die Initialisierung von Employee mit bestimmten Initialisierern, wie im Fall von e1, falsch und sollte entweder durch eine Listeninitialisierung oder eine verschachtelte Initialisierung als ersetzt werden folgt:

<code class="cpp">Employee e1{"John", "Wick", 40, 50000}; // List initialization
Employee e2{{"John", "Wick", 40}, 50000}; // Nested initialization
Employee e1{{.name{"John"}, .surname{"Wick"}, .age{40}}, 50000}; // Nested initialization with designated initializer for base class</code>
Nach dem Login kopieren

Im letzten Beispiel wird die Basisklasse Person mithilfe einer festgelegten Initialisierungsliste innerhalb der verschachtelten Initialisierung initialisiert.

Das obige ist der detaillierte Inhalt vonWarum kann ich abgeleitete Klassenmitglieder nicht mit bestimmten Initialisierern in C 20 initialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage