2010-10-29 11 views
14

¿Hay algún problema con una unión que tenga uno o más métodos? O algo por lo que tener cuidado? (Puedo ver que los constructores/destructores son problemáticos por razones esquizofrénicas)C++: ¿uniones con métodos?

+0

No veo nada malo en ellos excepto lo que mencionaste sobre los destructores y la memoria de liberación. – Jim

+1

Esto es exactamente por lo que no puede tener miembros de unión de un tipo de clase/estructura que tenga un constructor, un destructor o un operador de asignación no triviales. –

Respuesta

20

De los (N3092) Proyecto de normas C++ 03 ++ 0x & C:

9.5 Uniones
Una unión puede tener funciones miembro (incluyendo constructores y destructores), pero no funciones virtuales (10.3). Una unión no deberá tener clases base. No se utilizará una unión como clase base.

La inicialización de la unión utilizando la sintaxis de inicializador agregado (U u = { 42 };) o la creación de un miembro después (U u; u.i = 42;) no es "problemático". Y tampoco lo está inicializando usando un constructor (U u(42);).
El único "inconveniente" es que no puede usar la sintaxis agregada del inicializador para una unión que tenga un constructor definido por el usuario.

+0

es nuevo para C++ 0x, o ha sido parte del estándar C++? –

+0

@Jim: esa parte no ha cambiado. –

+0

sindicatos pueden tener constructores? entonces cuando es/no es la construcción un problema? –

-7

¿Cómo podría implementar tal cosa? Aquí hay un indicador de una unión, espero que no te importe que no tengas idea de qué variables son seguras y cuáles no.

Las uniones son en realidad una función de lenguaje mudo: han sido totalmente reemplazadas por métodos basados ​​en bibliotecas como boost :: variant o boost :: any. Algo así como el vacío * y las macros funcionales: rara vez son útiles en C++ en comparación con otras opciones.

+2

No te olvides del mundo integrado. A veces las cosas no son 100% seguras. –

+0

@Jason: ¿Cómo cambia el contenido? O sabes de qué tipo es, así que usa una variable regular, sabes que todos los tipos están relacionados, así que usa el polimorfismo, o necesitas saber qué tipo es antes de poder hacer algo. – Puppy

+5

Incrustado no cambia nada sobre el lenguaje per se, pero sí impone límites en la asignación de memoria dinámica y el polimorfismo (y gran parte de la potenciación está activada) que lo predispone hacia otras técnicas. La mayoría de las veces es una unión entre dos # de 16 bits y un # de 32 bits, o una unión entre un # de 16 o 32 bits y una estructura con campos de bits. En esos casos, ambos miembros de la unión tienen contenidos igualmente válidos; son ambos tipos. –