2011-03-11 7 views
7

Dada una clase como la siguiente y la unión dada, ¿cómo se inicializa la unión con el valor correcto?¿Cómo configurar la unión en el inicializador de clase?

Lo que se intenta aquí es utilizar dos o más tipos diferentes como uno de los tipos de datos básicos para la clase. En lugar de usar void *, dado que los tipos se conocen con anticipación, se construye una unión de los tipos que se van a usar. El problema es cómo inicializar el miembro correcto de la unión cuando se crea una instancia de la clase. Los tipos no son polimórficos, por lo que el modelo de herencia habitual no parece apropiado. Algunos intentos ingenuos de inicializar al miembro correcto de la unión no llevaron a ninguna parte.

union Union { 
    int n; 
    char *sz; 
}; 

class Class { 
    public: 
    Class(int n): d(1.0), u(n) {} 
    Class(char *sz): d(2.0), u(sz) {} 
    .... 
    double d; 
    Union u; 
}; 

Después de fregar para una solución, una respuesta hizo evidente, y, posiblemente, podría ser una buena solución para este repositorio de respuestas, por lo que se incluyen a continuación.

Respuesta

9

Para cualquier tipo que no tenga un constructor, resulta que puede inicializarlo en una unión. Este answer on union initializers da una pista para la solución:

union Union { 
    int n; 
    char *sz; 
    Union(int n): n(n) {} 
    Union(char *sz): sz(sz) {} 
}; 

ahora funciona como se esperaba. Obvio, si supieras qué buscar.

Editar: También puede observar el tipo utilizado en la unión en el constructor de su clase, generalmente con un int o similar.

Cuestiones relacionadas