2009-08-05 12 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; 
} 

を作成するためのより複雑な方法がありますクラスは、共用体を所有しているため、文字列を正しく破棄するには、クラスにセレクタ(スカラーまたはベクトルデータ型が使用されている)が必要です。

+1

HTMLタグを使用してコードをフォーマットしないでください。マウスでコードを選択してCtrl-Kと入力するだけです。 –

+1

DRY(あなた自身を繰り返さないでください)。 "5"はすでにintであり、 "7." alredy floatです。その厄介なCキャストは必要ありません。 –

+0

次に、const my_unionを区別しようとします。u1 = 0 これは、ポインタconst string *とshortのあいまいさを引き起こします。 それは明快にするために私は明示的修飾子を使用したのです。 – Dewfy

2

ユニオンには、stringなどの非PODデータ型を含めることはできません。そのため、あなたの質問は無意味です。非POD部材データの禁止にかかわらず

+0

OPが変更されましたが、疑問がまだ残っています – Maciek

+0

少し修正:unionにはコンストラクタまたはデストラクタを持たないデータ型を使用できます。 – Dewfy

+0

また非自明な代入演算子 –

3

(上記詳述のように)標準は言う:8.5.1.15で

:組合は括弧で囲まれ 初期化子で初期化されると、中括弧のみを含まなければなりません の初期化子の最初のメンバーです。

よう

​​

が動作するはずが、このフォームは、第二(およびそれ以降)のメンバーのために使用することができません。

+0

それで、あなたはそれをどのように初期化し、最初のメンバーにしたいのかを選ぶ必要があります。 –

関連する問題