包含union的struct的复制构造函数

时间:2015-01-09 01:08:33

标签: c++ unions

考虑代码

struct S
{
    S(){...}
    union
    {
        int* pi;
        double* pd;
    }
    // additional member functions etc
};

假设我们还有pipd的setter,也就是说,正在根据正在选择的union的哪个成员分配内存。

您如何为S编写复制构造函数?你怎么知道工会的哪个成员“活跃”?一种方法是在“激活”其中一个成员时设置一个额外的标志,还有其他方法吗?

2 个答案:

答案 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)