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