20.8.3 union
IDLに指定したunionは,メソッドとともにC++クラスへとマッピングされます。IDLに指定したunionの各メンバは,アクセッサ,およびミューテータとして動作する関数にマッピングされます。ミューテータ関数は,データメンバの値を設定します。
あらかじめ定義されている識別型の_dという名前のデータメンバも生成されます。unionが初めて作成される際には,この識別型の値は設定されていません。したがって,unionを使用する前に,アプリケーションはその識別型の値を設定する必要があります。提供されているメソッドのどれかを使用してデータメンバを設定すると,それらすべてのデータメンバは自動的に識別型として設定されます。次の表は,example_unionクラスで使用できるメソッドの幾つかを示しています。
メソッド |
説明 |
---|---|
_d() |
ディスクリミネータの値を返します。 |
_d(CORBA::Long) |
ディスクリミネータの値を設定します。ここでは,ディスクリミネータはlong型です。入力する引数の型は,ディスクリミネータのデータ型によって異なります。 |
example_union() |
デフォルトコンストラクタでは,識別型にデフォルト値が設定されますが,データメンバの初期化は実行されません。 |
example_union(const example_union& obj) |
コピーコンストラクタがソースオブジェクトのディープコピーを実行します。 |
~example_union() |
デストラクタがunionによって所有されているメモリを解放します。 |
operator=(const example_union& obj) |
代入演算子がディープコピーを実行します。また,必要な場合は,古いメモリを解放します。 |
コードサンプル20-26〜20-27では,example_unionの生成方法を示しています。
- コードサンプル20-26 structを含むIDL union
// IDL struct example_struct { long abc; }; union example_union switch(long) { case 1: long x; // a primitive data type case 2: string y; // a simple data type case 3: example_struct z; // a complex data type };
- コードサンプル20-27 IDL unionのC++クラスへのマッピング
// C++ struct example_struct { CORBA::Long abc; }; class example_union { private: CORBA::Long _disc; CORBA::Long _x; CORBA::String_var _y; example_struct _z; public: example_union(); ~example_union(); example_union(const example_union& obj); example_union& operator=(const example_union& obj); void x(const CORBA::Long val); const CORBA::Long x() const; void y(char *val); void y(const char *val); void y(const CORBA::String_var& val); const char *y() const; void z(const example_struct& val); const example_struct& z() const; example_struct& z(); CORBA::Long _d(); void _d(CORBA::Long); ... };
- 〈この項の構成〉
(1) unionの管理型
コードサンプル20-27に示したexample_unionクラスに加えて,example_union_varクラスも生成されます。_varの詳細については,「21.6 <class_name>_var」を参照してください。
(2) unionでのメモリ管理
union内の複合データ型のメモリ管理をするときは,次の点を注意してください。
-
データメンバの値を設定する際にアクセッサメソッドを使用する場合,ディープコピーが実行されます。小さめの型の場合は値を,大きめの型の場合は定数リファレンスを使って,パラメタをアクセッサメソッドに渡してください。
-
アクセッサメソッドを使用してデータメンバを設定する場合,そのメンバに対応していたメモリが解放されます。代入されているメンバがオブジェクトリファレンスである場合,そのオブジェクトのリファレンスカウントは,アクセッサメソッドが返される前に増やされます。
-
char *アクセッサメソッドは,渡されたポインタの所有権が引き受けられる前に,すべてのメモリを解放します。
-
const char *およびString_varアクセッサメソッドは,新しいパラメタのメモリがコピーされる前に,すべての古いメモリを解放します。
-
配列データメンバのアクセッサメソッドは,配列スライスを指すポインタを返します。詳細については,「20.8.5(1) 配列スライス」を参照してください。