IDLに指定したunionは,メソッドとともにC++クラスへとマッピングされます。IDLに指定したunionの各メンバは,アクセッサ,およびミューテータとして動作する関数にマッピングされます。ミューテータ関数は,データメンバの値を設定します。
あらかじめ定義されている識別型の_dという名前のデータメンバも生成されます。unionが初めて作成される際には,この識別型の値は設定されていません。したがって,unionを使用する前に,アプリケーションはその識別型の値を設定する必要があります。提供されているメソッドのどれかを使用してデータメンバを設定すると,それらすべてのデータメンバは自動的に識別型として設定されます。次の表は,example_unionクラスで使用できるメソッドの幾つかを示しています。
表20-3 example_unionクラス用に生成されたメソッド(C++)
メソッド | 説明 |
---|---|
_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の生成方法を示しています。
// 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
};
// 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);
...
};
コードサンプル20-27に示したexample_unionクラスに加えて,example_union_varクラスも生成されます。_varの詳細については,「21.6 <class_name>_var」を参照してください。
union内の複合データ型のメモリ管理をするときは,次の点を注意してください。