Как установить объединение в инициализаторе класса?

Учитывая такой класс, как приведенный ниже, и данное объединение, как инициализировать объединение правильным значением?

Здесь делается попытка использовать два или более разных типа в качестве одного из основных типов данных для класса. Вместо использования void *, учитывая, что типы известны заранее, создается объединение типов, которые будут использоваться. Проблема в том, как инициализировать правильный член объединения при создании экземпляра класса. Типы не являются полиморфными, поэтому обычная модель наследования не казалась подходящей. Некоторые наивные попытки инициализировать правильного члена профсоюза ни к чему не привели.

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;
};

После поиска решения ответ стал очевиден и, возможно, может быть хорошим решением для этого хранилища ответов, поэтому я включаю его ниже.


person glenng    schedule 11.03.2011    source источник


Ответы (1)


Для любого типа, не имеющего конструктора, оказывается, что вы можете инициализировать его в объединении. Этот ответ об инициализаторах объединения дает подсказку к решению:

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

Теперь все работает как положено. Очевидно, если бы вы знали, что искать.

Изменить: вы также можете отметить тип, используемый в объединении в вашем конструкторе класса, обычно с int или тому подобное.

person glenng    schedule 11.03.2011