Heim >Backend-Entwicklung >C++ >Warum kann ich bestimmte Initialisierer nicht verwenden, um geerbte Mitglieder in C 20 zu initialisieren?
Designierte Initialisierer in C 20: Einschränkungen verstehen
In C 20 bieten designierte Initialisierer eine praktische Möglichkeit, bestimmte Mitglieder eines Aggregats zu initialisieren. Allerdings unterliegen diese Initialisierer gewissen Einschränkungen.
Beachten Sie den bereitgestellten Beispielcode:
<code class="cpp">struct Person { std::string name{}; std::string surname{}; unsigned age{}; }; struct Employee : Person { unsigned salary{DEFAULT_SALARY}; }; int main() { Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // Possible Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // Error Employee e2{.salary{55000}}; // Warning }</code>
Wie im Code angegeben, sind sowohl Person als auch Employee Aggregate. Allerdings schlägt die Kompilierung der Initialisierung des Employee-Aggregats mit den angegebenen Initialisierern (e1) fehl. Warum ist das so?
Die Antwort liegt im C 20-Standard, insbesondere in Abschnitt 9.3.1 Aggregate, Punkt 3.1:
"Wenn die Initialisierungsliste eine Designated-Initializer-Liste ist, wird die Das Aggregat muss vom Klassentyp sein, der Bezeichner in jedem Bezeichner muss ein direktes, nicht statisches Datenmitglied der Klasse benennen, und die explizit initialisierten Elemente des Aggregats sind die Elemente, die diese Mitglieder sind oder enthalten 🎜>Mit anderen Worten: Designierte Initialisierer können nur zum Initialisieren von Mitgliedern der aktuellen Klasse verwendet werden. Sie können nicht für geerbte Mitglieder oder Basisklassenmitglieder verwendet werden. Diese Einschränkung ist der Grund, warum die Initialisierung von e1 ungültig ist.
Um e1 korrekt zu initialisieren, kann man die übliche Listeninitialisierungssyntax verwenden:
Alternativ kann man eine Kombination aus bezeichnet und verwenden nicht festgelegte Initialisierer, um das gleiche Ergebnis zu erzielen:<code class="cpp">Employee e1{ "John", "Wick", 40, 50000 }; // Works</code>In diesem Fall wird die direkte Basisklasse (Person) mithilfe einer festgelegten Initialisierungsliste initialisiert, während die gesamte Employee-Klasse mithilfe einer nicht festgelegten Initialisierungsliste initialisiert wird Initialisiererliste.
<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 }; // Also works</code>
Insgesamt ist es wichtig, sich an die Einschränkungen bestimmter Initialisierer zu erinnern, wenn man mit Klassenhierarchien in C 20 arbeitet. Durch die Verwendung der entsprechenden Initialisierungssyntax kann man Datenelemente sowohl der Basis- als auch der abgeleiteten Klassen effektiv und genau initialisieren .
Das obige ist der detaillierte Inhalt vonWarum kann ich bestimmte Initialisierer nicht verwenden, um geerbte Mitglieder in C 20 zu initialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!