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

copy constructor for struct containing a union

本文关键字:结构 构造函数 包含联 复制      更新时间:2023-10-16

考虑代码

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

假设我们也有 pipd 的二传手 ,也就是说,根据选择联合的哪个成员来分配内存。

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

你怎么知道工会的哪个成员是"活跃的"?

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

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

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

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

在您的情况下,您必须给工会起一个名称,以便您可以sizeof myunion

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