我想定义一个union,用于读取特殊类型的二进制文件。联盟应该有两个成员,一个是int,另一个是一种字符串,或任何其他问题;这样做的最佳方式是什么?
union uu {
int intval;
wstring strval;
uu(){ memset(this, 0, sizeof(this)); }
}
它说:“工会的成员strval有复制构造函数” 我认为strval应该有*或a&amp ;; 你会如何定义它?
提前谢谢你 糟糕答案 0 :(得分:9)
你不能这样做。工会成员必须是POD类型 - 即他们不得拥有构造函数或析构函数。即使你可以,你对memset的调用也会遍及整个字符串,从而导致未定义的行为。你当然可以使用指针:
union uu {
int intval;
wstring * strval;
uu(){ memset(this, 0, sizeof(uu)); }
};
答案 1 :(得分:5)
boost.variant
是您想要使用的
boost::variant<int, wstring> v("hello");
如果使用指针作为联合的成员,则必须分配并释放指针指向自己的字符串,最好使用new
和delete
。
boost::variant
解决了这个问题:它分配了变体对象本身内的所有成员(因此没有用于存储成员的动态分配),并且您不必执行任何new
或{{1}打电话给自己。