Heim > Backend-Entwicklung > C++ > Warum kann ich bestimmte Initialisierer nicht verwenden, um geerbte Mitglieder in C 20 zu initialisieren?

Warum kann ich bestimmte Initialisierer nicht verwenden, um geerbte Mitglieder in C 20 zu initialisieren?

Barbara Streisand
Freigeben: 2024-10-28 17:13:02
Original
584 Leute haben es durchsucht

Why can't I use designated initializers to initialize inherited members in C  20?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

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