2010-04-05 60 views
0

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

union uu { 
    int intval; 
    wstring strval; 

    uu(){ memset(this, 0, sizeof(this)); } 
} 

它说:“联盟成员strval有拷贝构造函数” 我认为strval应该有一个*或&; 你会如何定义它?

在此先感谢
哎呀

+8

'memset(this,0,sizeof(this));'不要在你写的任何类中这样做。 – GManNickG 2010-04-05 14:05:44

+0

我不明白你的工会。你不能想要一个'int'或一个宽的string_。数据如何可以是一个32位整数或一个字符串,宽或不是?你确定你不是在寻找'wchar_t',宽字符吗? – zneak 2010-04-05 14:08:00

+3

@zneak:'wstring'不是一个POD旁边,一个工会的成员可以是不同的大小。 – kennytm 2010-04-05 14:11:38

回答

9

你不能做到这一点。工会成员必须是POD类型 - 即他们不得有构造函数或析构函数。即使可以,对memset的调用也会对整个字符串造成践踏,导致未定义的行为。你当然也可以使用指针:

union uu { 
    int intval; 
    wstring * strval; 

    uu(){ memset(this, 0, sizeof(uu)); } 
}; 
+0

虽然空指针不一定都是0的。所以这个构造函数仍然不正确。 – GManNickG 2010-04-05 14:46:55

+0

为了完整性,您应该提及他需要为指针指定某些内容。所以就像'u.strval = new wstring(“foo”)',他需要''删除'之后的内存。 – 2010-04-05 15:12:15

+2

C++ 0x增加了在工会中存储非POD类型的功能。但现在,它只是POD类型。 – jalf 2010-04-05 16:59:50

5

boost.variant是你想要的。如果你使用指针作为工会的成员才能使用

boost::variant<int, wstring> v("hello"); 

什么,你必须分配和释放的String指针指向自己,最好使用newdelete

boost::variant解决了这个问题:它分配的所有成员变量对象本身(所以对存储组件没有动态分配)之内,你不必做任何newdelete称自己在所有。