C++ 串连

C++ 串连,c++,C++,我想定义一个联合,用于读取特殊类型的二进制文件。这个联合体应该有两个成员,一个是int,另一个是字符串,或者任何其他的,这就是问题所在;最好的方法是什么 union uu { int intval; wstring strval; uu(){ memset(this, 0, sizeof(this)); } } 它说:“union的成员strval具有复制构造函数” 我认为strval应该有一个*或一个&; 你如何定义它 提前感谢 哎呀,你做不到。联合

我想定义一个联合,用于读取特殊类型的二进制文件。这个联合体应该有两个成员,一个是int,另一个是字符串,或者任何其他的,这就是问题所在;最好的方法是什么

union uu {  
    int intval;  
    wstring strval;  

    uu(){ memset(this, 0, sizeof(this)); }  
}
它说:“union的成员strval具有复制构造函数” 我认为strval应该有一个*或一个&; 你如何定义它

提前感谢

哎呀,你做不到。联合体的成员必须是POD类型-即,它们不能有构造函数或析构函数。即使可以,对memset的调用也会破坏整个字符串,导致未定义的行为。当然,您可以使用指针:

union uu {  
    int intval;  
    wstring * strval;  

    uu(){ memset(this, 0, sizeof(uu)); }  
};
这是你想用的

boost::variant<int, wstring> v("hello");
boost::variant v(“hello”);
如果将指针用作联合体的成员,则必须分配并释放指针指向自己的字符串,最好使用
new
delete


boost::variant
解决了这个问题:它在variant对象本身中分配所有成员(因此没有存储成员的动态分配),并且您根本不需要执行任何
new
delete
调用自己

memset(this,0,sizeof(this))int
或宽字符串。数据如何可以是32位整数或字符串,宽或不宽?你确定你不是在寻找宽字符“
wchar\u t
”吗?@zneak:
wstring
不把它放在一边,联盟中的成员可以有不同的大小。@KennyTM:我说的更多的是语义。@zneak,仔细阅读我的问题。答案在于,在外面的整个野生世界里,生活着许多不同的奇特的档案类型。实际上,它是一个四字节四个字符的文件,我准备将它作为一个int32,如果另一个参数有一个特殊的标志,它是指向文件中任意一个字符串的指针。尽管空指针不一定都是0。因此,构造函数仍然是不正确的。为了完整性,您应该提到他需要为指针赋值。因此,这就像
u.strval=newwstring(“foo”)
一样,他需要
delete
之后的内存。C++0x增加了在联合中存储非POD类型的能力。但现在,它只是豆荚类型。