2010-10-29 3 views
14

Y a-t-il un problème avec une union ayant une ou plusieurs méthodes? Ou quelque chose à surveiller? (Je peux voir que les constructeurs/destructeurs sont problématiques pour des raisons schizophréniques)C++: unions avec méthodes?

+0

Je ne vois rien de mal avec eux, sauf ce que vous avez mentionné sur les destructeurs et la mémoire de libération. – Jim

+1

C'est exactement pourquoi vous ne pouvez pas avoir de membres de classe d'un type classe/struct qui a un constructeur non-trivial, un destructeur ou un opérateur d'affectation. –

Répondre

20

Des C++ 03 & C++ 0x normes (Projet N3092):

9.5 Les syndicats
Un syndicat peut avoir des fonctions membres (y compris constructeurs et destructeurs), mais pas fonctions virtuelles (10.3). Une union ne doit pas avoir de classes de base. Une union ne doit pas être utilisée comme classe de base.

Initialiser l'union en utilisant la syntaxe globale de initialiseur (U u = { 42 };) ou la fixation d'un membre après (U u; u.i = 42;) n'est pas « problématique ». Et aucun ne l'initialise en utilisant un constructeur (U u(42);).
La seule "capture" est que vous ne pouvez pas utiliser la syntaxe d'initialisation agrégée pour une union qui a un constructeur défini par l'utilisateur.

+0

est-ce nouveau pour C++ 0x, ou a-t-il fait partie de la norme C++? –

+0

@Jim: Cette partie est inchangée. –

+0

les syndicats peuvent avoir des constructeurs? alors quand est/n'est pas la construction un problème? –

-7

Comment pourriez-vous éventuellement implémenter une telle chose? Voici un pointeur vers une union, espérons que cela ne vous dérange pas que vous n'ayez aucune idée des variables qui peuvent être utilisées en toute sécurité et celles qui ne le sont pas.

Les unions sont vraiment une fonctionnalité de langue morte - elles ont été totalement remplacées par des méthodes basées sur des bibliothèques comme boost :: variant ou boost :: any. Semblable aux macros void * et fonctionnelles - elles sont très rarement utiles en C++ par rapport aux autres options.

+2

Ne pas oublier le monde intégré. Parfois, les choses ne sont pas 100% typesafe. –

+0

@Jason: Comment le fait d'être embarqué change-t-il quelque chose? Soit vous savez de quel type il s'agit, donc utilisez une variable régulière, vous savez que tous les types sont liés, utilisez donc le polymorphisme, ou vous devez savoir de quel type il s'agit avant de pouvoir faire quoi que ce soit. – Puppy

+5

Embedded ne change rien au langage en lui-même, mais il place des limites sur l'allocation dynamique de la mémoire et le polymorphisme (et beaucoup de boost est sorti) qui vous orientent vers d'autres techniques. Le plus souvent, il y a une union entre deux # de 16 bits et un # de 32 bits, ou une union entre un # de 16 ou de 32 bits et une structure avec des champs de bits. Dans ces cas, les deux membres du syndicat ont des contenus tout aussi valables; c'est les deux types. –

Questions connexes