Как установить объединение в инициализаторе класса? - PullRequest
7 голосов
/ 11 марта 2011

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

Здесь делается попытка использовать два или более различных типов в качестве одного из основных типов данных для класса. Вместо использования 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;
};

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

1 Ответ

9 голосов
/ 11 марта 2011

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

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

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

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

...