包含联合的结构的复制构造函数

copy constructor for struct containing a union

考虑代码

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

假设我们也有 pipd 的设置器,也就是说,根据选择的联合体成员分配内存。

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

How can you know which member of the union is "active"?

你不能,除非你存储一个标志来告诉你它的分配方式。通常将这样的 "selector" 标志存储在封闭的 class 中,例如:

struct S
{
    S(){...}
    union
    {
        int* pi;
        double* pd;
    }
    enum {
        UseIntPtr,
        UseDoublePtr
    } unionSelector;
    // additional member functions etc
};

当您设置 pi 时,您可以将 unionSelector 设置为 UseIntPtr,或者当您设置 pd 时,您可以将 UseDoublePtr 设置为 UseDoublePtr。然后你将有一个标志用于你的复制构造函数、赋值运算符等。

如果联合是 POD(普通旧数据),那么您可以使用 memcpy。效果很好。

在你的情况下,你必须给工会起个名字,这样你就可以 sizeof myunion

memcpy(&this->myunion, &other.myunion, sizeof myunion)