C++ de l'Union, Struct type de Membre
Si j'ai une classe:
class Odp
{
int i;
int b;
union
{
long f;
struct
{
WCHAR* pwszFoo;
HRESULT hr;
};
};
}
Union, de toutes les valeurs de la liste, il ne peut prendre une de ces valeurs à un moment? Comment cela fonctionne en termes d'accès à ces variables? Comment aurais-je accès hr
directement? Si j'ai mis hr
, qu'advient-il si j'essaie d'accéder à f
?
OriginalL'auteur Nick Heiner | 2010-06-18
Vous devez vous connecter pour publier un commentaire.
C'est un très prégnante dans la norme C++ - essentiellement une instance de l'union, conformément à la norme ne peut être traitée à tout moment, comme si elle contenait un "actif" membre - le dernier écrit. Donc:
alors:
est OK, mais:
ne l'est pas. Cependant, il existe de vastes volumes de code existant qui disent que les deux sont OK. et dans l'autre, ou en tout, cas une exception soit levée pour un "non valide". Le langage C++ utilise des exceptions exceptionnellement (!) avec parcimonie.
En gros, si vous vous trouvez à l'aide de syndicats dans votre code C++ de traiter avec quelque chose, mais C bibliothèques, quelque chose est incorrect.
reinterpret_cast
est utilisable à la place d'un syndicat, la plupart du temps.OriginalL'auteur
Chaque fois que vous avez défini (écrire) un membre d'un syndicat, vous avez essentiellement le rendre "active". Vous êtes uniquement autorisé à lire le actuellement membre actif de l'union. Cela signifie qu'il est de votre responsabilité de se rappeler d'une certaine manière qui est actif à chaque moment dans le temps.
Tente d'accéder à l'inactifs membre d'une union conduit à un comportement indéfini.
Gardez également à l'esprit que votre code n'est pas valide en C++. Il n'y a pas une telle chose comme "anonyme struct" en C++. Votre struct membre doit avoir un nom. Si votre compilateur accepte, c'est tout simplement un non-standard d'extension pris en charge par votre compilateur spécifique.
ONeal: Oui, il devrait, pour des raisons évidentes. Depuis les types sont généralement indépendants, les autres (inactif) membre peut facilement se retrouver avec piège de la représentation. Qui est le principal (et évident) raison, le comportement est indéfini.
"piège de la représentation" <-- Jamais entendu parler de ça avant. +1
OriginalL'auteur AnT
Droite, avec un
union
les mêmes emplacements de mémoire sera utilisé pour représenter un seul des membres à un moment donné. Donc, si vous avez une instance de l'union et définir la valeur dehr
, vous obtiendrez des ordures ensuite, si vous essayez de lire la valeur def
.Essayez d'utiliser les éléments suivants pour accéder à
hr
:C'est un C; C n'ont pas d'exceptions. Utilisez les syndicats à vos risques et périls 🙂
Aucune exception sera levée; il est au programmeur de s'assurer qu'ils sont en accédant au bon membre de la
union
.OriginalL'auteur Justin Ethier
Il signifie simplement que vous pouvez accéder à la même mémoire que ce soit le long, ou la struct.
Pour accéder à
hr
:Lien intéressant: http://www.cplusplus.com/forum/general/18816/
Techniquement, c'est illégal dans C. C'est légal en C++, dans lequel cas, les noms sont exposées en tant que membres de
class Odp
.Belle prise @Billy
ONeal: Incorrect. "Anonyme structures" sont illégales en C++. C++ prend en charge anonyme syndicats, mais pas anonyme des structures. L'OP déclaration est mal formé.
Weldon: Dans votre réponse,
Odp o1();
déclare une fonction, pas un objet. En quelque sorte, Il pense que ce n'était pas votre intention.OriginalL'auteur John Weldon
Tentative d'accès à "f" vous donnera un résultat. Il sera probablement la représentation des autres membres de l'union de données de type "f", c'est à dire, dans ce cas, vous êtes probablement va être la lecture de tout ou partie du contenu de la "pwszFoo" représentés comme "long" type de données. Concept général est facile - membres de l'union partagent le même emplacement en mémoire.
OriginalL'auteur ivan.ukr