Designierte Initialisierer in C 20: Einschränkungen erklärt
Designierte Initialisierer, die in C 20 eingeführt wurden, ermöglichen es Ihnen, die Reihenfolge der Elementinitialisierung für Aggregate explizit anzugeben . Allerdings ist kürzlich eine Frage bezüglich ihrer Verwendung für abgeleitete Klassen aufgetaucht.
Im bereitgestellten Codebeispiel:
<code class="cpp">struct Person { std::string name{}; std::string surname{}; unsigned age{}; }; struct Employee : Person { unsigned salary{DEFAULT_SALARY}; }; int main() { Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // doesn't compile Employee e2 {.salary{55000}}; // warning: missing initializer for base class member }</code>
Der Code kann e1 nicht kompilieren, da bestimmte Initialisierer nur zur Initialisierung verwendet werden können nichtstatische Mitglieder der abgeleiteten Klasse direkt. Mit anderen Worten: Sie können Mitglieder einer Basisklasse nicht direkt mit bestimmten Initialisierern initialisieren.
Um dieses Problem zu beheben, können Sie die folgenden Ansätze verwenden:
Traditionelle Listeninitialisierung:
<code class="cpp">Employee e1{ "John", "Wick", 40, 50000 };</code>
Verschachtelte designierte Initialisierungsliste:
<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };</code>
Alternativ können Sie, wie von @Jarod42 vorgeschlagen, auch die Initialisierungsliste angeben für die Basisklasse explizit:
<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, .salary{50000} };</code>
Dadurch können Sie sowohl die direkten Basisklassenmitglieder als auch die abgeleiteten Klassenmitglieder mithilfe bestimmter Initialisierer initialisieren.
Das obige ist der detaillierte Inhalt vonKönnen designierte Initialisierer zum Initialisieren von Basisklassenmitgliedern in C 20 verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!