Maison > développement back-end > C++ > 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
Libérer: 2024-10-29 19:06:30
original
690 Les gens l'ont consulté

 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>
Copier après la connexion

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>
    Copier après la connexion
  • Liste d'initialiseurs désignée imbriquée :

    <code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };</code>
    Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal