Maison  >  Article  >  développement back-end  >  Les initialiseurs désignés peuvent-ils être utilisés pour initialiser les membres de la classe de base dans C 20 ?

Les initialiseurs désignés peuvent-ils être utilisés pour initialiser les membres de la classe de base dans C 20 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-29 19:06:30640parcourir

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

Initialiseurs désignés dans C 20 : explication des limitations

Les initialiseurs désignés introduits dans C 20 vous permettent de spécifier explicitement l'ordre d'initialisation des membres pour les agrégats . Cependant, une question récente s'est posée concernant leur utilisation pour les classes dérivées.

Dans l'exemple de code fourni :

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

Le code ne parvient pas à compiler e1 car les initialiseurs désignés ne peuvent être utilisés que pour initialiser directement les membres non statiques de la classe dérivée. En d'autres termes, vous ne pouvez pas initialiser les membres d'une classe de base directement avec les initialiseurs désignés.

Pour résoudre ce problème, vous pouvez utiliser les approches suivantes :

  • Initialisation de liste traditionnelle :

    <code class="cpp">Employee e1{ "John", "Wick", 40, 50000 };</code>
  • Liste d'initialiseurs désignée imbriquée :

    <code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };</code>

Alternativement, comme suggéré par @Jarod42, vous pouvez également spécifier la liste d'initialiseurs pour la classe de base explicitement :

<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, .salary{50000} };</code>

Cela vous permet d'initialiser à la fois les membres directs de la classe de base et les membres de la classe dérivée à l'aide d'initialiseurs désignés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn