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