2009-08-05 146 views
2

我有一個聯盟:初始化骨料工會

union my_union 
{ short int Int16; float Float; }; 

我想創建:

const my_union u1 = ???; 
const my_union u2 = ???; 

並初始化它們的值分別爲不同的類型: U1 - > INT16 u2 - > float

我該怎麼做?如果上述不可行,是否有任何解決方法?

回答

10

工會可以有任意數量的構造函數 - 這會爲沒有構造任何數據類型的工作,所以你的例子是很好,如果排除字符串(或使指針字符串)

#include <string> 
using namespace std; 
union my_union 
{ 
    my_union(short i16): 
     Int16(i16){} 
    my_union(float f): 
     Float(f){} 
    my_union(const string *s): 
     str(s){} 

    short int Int16; float Float; const string *str; 
}; 

int main() 
{ 
    const my_union u1 = (short)5; 
    const my_union u2 = (float)7.; 
    static const string refstr= "asdf"; 
    const my_union u3 = &refstr; 
} 

還有就是要創建更復雜的方式類,由union擁有,類必須有一個選擇器(使用標量或向量數據類型) - 正確地銷燬字符串。

2

工會不能包含非POD數據類型,如字符串,所以你的問題是沒有意義的。

+0

OP修改後,問題仍然存在 – Maciek 2009-08-05 09:09:34

+0

有點不正確:union可以有任何數據類型,它沒有構造函數或析構函數。 – Dewfy 2009-08-05 09:35:32

+0

也是不重要的賦值運算符 – 2009-08-05 09:43:39

3

儘管對非POD構件數據的禁令(如上闡述)標準說:

在8.5.1.15:當一個聯合用括號括起 初始化初始化時,大括號,應僅包含一個初始值爲 聯盟的第一個成員。

所以

​​

應該工作,但不能被用於第二(和隨後的)的成員這種形式。