包含联合的结构的复制构造函数
copy constructor for struct containing a union
考虑代码
struct S
{
S(){...}
union
{
int* pi;
double* pd;
}
// additional member functions etc
};
假设我们也有 pi
和 pd
的设置器,也就是说,根据选择的联合体成员分配内存。
您将如何为 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)
考虑代码
struct S
{
S(){...}
union
{
int* pi;
double* pd;
}
// additional member functions etc
};
假设我们也有 pi
和 pd
的设置器,也就是说,根据选择的联合体成员分配内存。
您将如何为 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)