L'utilisation d'union à l'intérieur d'une classe
J'ai vu un peu de code comme suit:
class A
{
private:
union {
B *rep;
A *next;
}; //no variables of this anonymous defined!
void func()
{
A *p = new A;
p->next = NULL; //why p has a member variable of 'next'?
}
};
J'ai compilé le code ci-dessus avec VS2010 sans aucune erreur.
Là est la question,
pourquoi p est une variable membre "suivant"?
union {
B *rep;
A *next;
};
Pour autant que je sais, c'est un anonyme de l'union, sans même la définition d'une variable. Comment pouvons-nous accéder aux variables membres à l'intérieur de cette union comme ça?
Vous devez vous connecter pour publier un commentaire.
Parce que c'est à peu près ce qu'un anonyme de l'union de fait, il définit zéro ou plusieurs variables dans le bloc à l'intérieur de l'espace de noms (ce qui, dans une déclaration de classe rend noms de champ) qui se recoupent, de la mémoire. Par conséquent, il est le même que si vous voulez déclaré
...sauf pour les rep et le prochain occupant de chevauchement de l'espace (ou étant donné que les deux pointeurs ont la même taille, le même espace), et donc tous les dangers et les avantages qui viennent avec un nom de l'union.
Voici la citation de la norme de contrôle ce comportement: la section
[class.union]
(libellé à partir de C++0x projet de n3242)Je ne suis pas vraiment sûr de comprendre votre question.
Un a le membre de p, parce que vous avez déclaré dans Un l'intérieur d'un anonyme de l'union avec rep.
Vous ne déclarez une variable! C'est juste que " rep " et "suivant" partagent la même mémoire.
Vous pouvez y accéder juste la façon dont vous l'avez fait.
anonyme syndicats (tout comme les structures) mettre leurs membres, dans le même espace de noms que l'au-dessus de l'espace de noms est.
C'est utile par exemple:
Je suis surpris de voir qu'il est un moderne compilateur qui permet encore de construire. Il est l'un des premiers jours de la C, circa 1975. En ces jours, la structure et les membres du syndicat n'ont pas été effectivement liée à une structure particulière, mais ne contenait que des attributs d'un décalage à partir d'une adresse de base et un type de données.
Le résultat final a été que l'utilisation d'une structure ou d'une union correctement les résultats dans le code correct avec des expressions évaluées comme prévu. La seule différence est que l'usage abusif d'un membre de structure avec un pointeur qui n'est pas associé avec le type ne pourrait être considérée comme une erreur. Je ne pense pas qu'il y avait une raison particulière de ne pas faire appliquer l'associé—K&R allusion qu'à l'avenir les compilateurs espérons serait de vérifier de telles utilisations—probablement juste pour enregistrer la table des symboles de l'espace dans les 16 bits de terre.