Heim  >  Artikel  >  Backend-Entwicklung  >  Können designierte Initialisierer zum Initialisieren von Basisklassenmitgliedern in C 20 verwendet werden?

Können designierte Initialisierer zum Initialisieren von Basisklassenmitgliedern in C 20 verwendet werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-29 19:06:30638Durchsuche

 Can Designated Initializers be Used to Initialize Base Class Members in C  20?

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!

Stellungnahme:
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