Maison > développement back-end > C++ > le corps du texte

Pourquoi ne puis-je pas utiliser des classes avec des constructeurs non triviaux dans les unions C ?

Mary-Kate Olsen
Libérer: 2024-11-19 17:19:03
original
951 Les gens l'ont consulté

Why can't I use classes with non-trivial constructors in C   unions?

Comprendre les restrictions syndicales

En C , une union représente une région mémoire partagée par plusieurs membres de données. Cependant, le compilateur restreint l'utilisation de classes avec des constructeurs non triviaux, des constructeurs par copie ou des destructeurs au sein des unions.

Le problème

Lorsque vous essayez de déclarer une union avec un membre de chaîne, comme indiqué ci-dessous :

union U
{
   int i;
   float f;
   string s;
};
Copier après la connexion

le compilateur génère une erreur indiquant que U::s a une copie constructeur.

Pourquoi la restriction ?

Cette restriction existe car avoir une classe avec des opérations non triviales dans une union introduit des défis de gestion de la mémoire. Dans une structure typique, chaque membre se voit attribuer sa propre mémoire. Dans une union, cependant, tous les membres partagent la même adresse mémoire.

Considérons l'exemple ci-dessous :

union U
{
  string x;
  vector<int> y;
};

U u;  // <--
Copier après la connexion

Si u était une structure, u.x et u.y seraient initialisés avec une chaîne vide et vecteur, respectivement. Cependant, dans une union, u.x et u.y partagent la même adresse. Ainsi, l'initialisation de l'un d'eux écraserait les données de l'autre.

Alternatives : Unions étiquetées et extensibilité

Pour résoudre ce problème, C 0x a introduit les "unions étiquetées". " Ces unions permettent d'utiliser une variable de membre pour indiquer quel membre est actif, ce qui permet une construction et une destruction plus flexibles des membres de classe au sein de l'union.

Alternativement, des bibliothèques externes telles que Boost.Variant et Boost.Any fournissent fonctionnalité similaire tout en encapsulant la complexité de la gestion de la mémoire.

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