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?
Répondre
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.
est-ce nouveau pour C++ 0x, ou a-t-il fait partie de la norme C++? –
@Jim: Cette partie est inchangée. –
les syndicats peuvent avoir des constructeurs? alors quand est/n'est pas la construction un problème? –
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.
Ne pas oublier le monde intégré. Parfois, les choses ne sont pas 100% typesafe. –
@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
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. –
- 1. Optimisation des unions
- 2. Flex XMLList Intersections, Unions, Différences
- 3. Algorithme graphique Unions, intersection, soustraction
- 4. Transformation de méthodes C# en méthodes C++
- 5. Compteurs d'expression de table communs avec 2 unions
- 6. Méthodes statiques en C#?
- 7. Gestion des unions, sous-ensembles et surensembles dans Scala
- 8. Modélisation de plusieurs niveaux d'héritage en utilisant des unions discriminées
- 9. anonyme classes non étiquetées vides, structures, unions, et enums
- 10. pointeur pointeur C++ Méthodes
- 11. C# RealProxy: méthodes génériques?
- 12. C# Dérivation Méthodes génériques
- 13. Méthodes génériques en C#
- 14. méthodes "protégées" en C#?
- 15. Méthodes proxy WSDL C#
- 16. méthodes compréhension c objectif
- 17. C#: signatures de méthodes?
- 18. Fonctions/Méthodes en Objective C!
- 19. bibliothèque méthodes Fluent pour C#
- 20. Méthodes d'analyse de C++ définies?
- 21. Méthodes de surcharge en C#
- 22. Partage des unions discriminées dans les fichiers Signature
- 23. Structures et Unions en C, détermination de la taille et accès aux membres
- 24. C#, WinForms et méthodes d'extension
- 25. Problème avec les méthodes d'extension de sérialisation C#
- 26. Comment étendre une classe avec les méthodes d'extension C#?
- 27. VS2008 C# Exceptions avec des méthodes invoquées par la réflexion
- 28. C# problème de conception OO avec priorité des méthodes
- 29. Surcharge des méthodes STL C++
- 30. méthodes abstraites statiques dans C++
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
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. –