の初期化:私は労働組合を持って集計労働組合に
union my_union
{ short int Int16; float Float; };
私が作成したい:
const my_union u1 = ???;
const my_union u2 = ???;
をそれぞれ異なったタイプのものであると、それらの値を初期化します。 U1 - > INT16 u2 - > float
どうすればよいですか?上記が不可能な場合は、回避策がありますか?
の初期化:私は労働組合を持って集計労働組合に
union my_union
{ short int Int16; float Float; };
私が作成したい:
const my_union u1 = ???;
const my_union u2 = ???;
をそれぞれ異なったタイプのものであると、それらの値を初期化します。 U1 - > INT16 u2 - > float
どうすればよいですか?上記が不可能な場合は、回避策がありますか?
組合は、コンストラクタの任意の番号を持つことができます - これは、コンストラクタなしで任意のデータ型のために動作しますが、文字列を除外(または文字列へのポインタを作る)場合はあなたの例がよくあるので
#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;
}
を作成するためのより複雑な方法がありますクラスは、共用体を所有しているため、文字列を正しく破棄するには、クラスにセレクタ(スカラーまたはベクトルデータ型が使用されている)が必要です。
(上記詳述のように)標準は言う:8.5.1.15で
:組合は括弧で囲まれ 初期化子で初期化されると、中括弧のみを含まなければなりません の初期化子の最初のメンバーです。
よう
が動作するはずが、このフォームは、第二(およびそれ以降)のメンバーのために使用することができません。
それで、あなたはそれをどのように初期化し、最初のメンバーにしたいのかを選ぶ必要があります。 –
HTMLタグを使用してコードをフォーマットしないでください。マウスでコードを選択してCtrl-Kと入力するだけです。 –
DRY(あなた自身を繰り返さないでください)。 "5"はすでにintであり、 "7." alredy floatです。その厄介なCキャストは必要ありません。 –
次に、const my_unionを区別しようとします。u1 = 0 これは、ポインタconst string *とshortのあいまいさを引き起こします。 それは明快にするために私は明示的修飾子を使用したのです。 – Dewfy