Hitachi

VisiBroker Version 5 Borland(R) Enterprise Server VisiBroker(R) プログラマーズリファレンス


20.8.3 union

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の生成方法を示しています。

コードサンプル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内の複合データ型のメモリ管理をするときは,次の点を注意してください。