2010-04-05 39 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稱自己在所有。