考虑代码
struct S
{
S(){...}
union
{
int* pi;
double* pd;
}
// additional member functions etc
};
假设我们还有pi
和pd
的setter,也就是说,正在根据正在选择的union的哪个成员分配内存。
您如何为S
编写复制构造函数?你怎么知道工会的哪个成员“活跃”?一种方法是在“激活”其中一个成员时设置一个额外的标志,还有其他方法吗?
答案 0 :(得分:3)
你怎么知道工会的哪个成员是“活跃的”?
你不能,除非你存储一个标志来告诉你它被分配的方式。通常在封闭类中存储这样的“selector”标志,例如:
struct S
{
S(){...}
union
{
int* pi;
double* pd;
}
enum {
UseIntPtr,
UseDoublePtr
} unionSelector;
// additional member functions etc
};
设置unionSelector
时,您需要将UseIntPtr
设置为pi
,设置UseDoublePtr
时设置为pd
。然后,您将在复制构造函数,赋值运算符等中使用标记。
答案 1 :(得分:3)
如果联合是POD(普通旧数据),那么您可以使用memcpy
。效果很好。
在你的情况下,你必须给工会一个名字,这样你就可以sizeof myunion
。
memcpy(&this->myunion, &other.myunion, sizeof myunion)