2016-02-06 3 views
2

У меня есть анонимный союз в структурыКак скопировать анонимный союз

struct A { 
    union { 
    char c; 
    double d; 
    }; 
    A(const A &a) { 
    c = a.c; 
    d = a.d; 
    } 
}; 

Мне было интересно, что это лучший способ, чтобы определить его конструктор копирования. Нужно ли копировать все поля объединения? Думаю, нам нужно ...?

+0

Только один элемент данных объединения имеет значение в любой момент времени. Какой элемент данных содержит значение, обычно обозначается * discinantinant * (объектом), содержащимся внутри класса. Копировальные конструкторы использовали бы этот дискриминант. – Silversonic

+0

Я бы использовал 'memcpy (& c, & a.c, sizeof (union {char c; double d;}));', возможно, с типом typedef для 'union'. – dasblinkenlight

+0

@dasblinkenlight, будет ли c и d всегда находить с того же адреса? –

ответ

3

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

Как правило, при использовании таких объединений у вас будет какое-то поле «тега», в котором будет отслеживаться, какое поле активно. Затем вы можете использовать оператор switch этого тега, чтобы определить, какое поле является активным, и как его скопировать.

В качестве альтернативы рассмотрите использование boost::variant, который представляет собой защищенную типа оболочку вокруг объекта одного из фиксированного числа типов.

+0

Это некоторые устаревшие коды без тегов. Если мы скопируем все поля, хотя активен только один, будет ли копия другой неактивной иметь неправильное значение? Я думаю, что внутренне все данные хранятся в виде необработанных битов, при запуске не должно быть никакого времени выполнения вне очереди. Но я не уверен, что это безопасно ... –

+0

Я считаю, что это неопределенное поведение для чтения из поля объединения, которое не было последним, поэтому это небезопасно. – templatetypedef

+0

Если мы ничего не делаем, компилятор генерирует конструктор-конструктор по умолчанию? Я думаю, что он не знает, какой из них активен, может ли конструктор по умолчанию работать в определенном поведении? –

Смежные вопросы