20.8.5 配列
IDLで指定した配列は,C++配列にマッピングされます。マッピングされた配列を静的に初期化できます。IDL配列要素が文字列またはオブジェクトリファレンスである場合,C++配列ではそれらの要素が_var型となります。コードサンプル20-33〜20-34は,異なる要素型を持つ三つの配列を示しています。
- コードサンプル20-33 IDL配列定義
// IDL interface Intf { ... }; typedef long L[10]; typedef string S[10]; typedef Intf A[10];
- コードサンプル20-34 IDL配列のC++配列へのマッピング
// C++ typedef CORBA::Long L[10]; typedef CORBA::String_var S[10]; typedef Intf_var A[10];
文字列およびオブジェクトリファレンスに対して_varという管理型を使うことによって,配列要素が代入された際にメモリが透過的に管理できます。
- 〈この項の構成〉
(1) 配列スライス
array_slice型は複次元配列のパラメタを渡す際に使用されます。一次元配列以外の配列に対して_slice型がVisiBrokerのIDLコンパイラによって生成されます。パラメタを渡したり,返したりする際に,_slice型を使うと便利です。コードサンプル20-35とコードサンプル20-36は,_slice型の例を示しています。
(2) 配列の管理型
VisiBrokerのIDLコンパイラは,IDL配列に対するC++配列だけでなく,_varクラスも生成します。このクラスは,配列の拡張機能を提供します。
-
配列要素への直感的なアクセスを可能にするためoperator[ ]がオーバーロードされます。
-
配列の_sliceオブジェクトに対するポインタを引数として使用するために,コンストラクタと代入演算子が提供されます。
- コードサンプル20-37 配列のIDL定義
// IDL typedef long L[10];
- コードサンプル20-38 配列に対して生成された_varクラス
// C++ class L_var { public: L_var(); L_var(L_slice *slice); L_var(const L_var& var); ~L_var(); L_var& operator=(L_slice *slice); L_var& operator=(const L_var& var); CORBA::Long& operator[ ](CORBA::ULong index); operator L_slice *(); operator L &() const; ... private: L_slice*_ptr; };
(3) タイプセーフ配列
any型にマッピングされた要素を持つ配列を処理するために,_foranyという特別なクラスが生成されます。_varクラスと同様に,_foranyクラスでも下位の配列型にアクセスできます。Any型がメモリの所有権を引き受けるので,_foranyクラスは,デストラクトの際にメモリを解放しません。関数を適切にオーバーロードし,ほかの型と見分けられるようにするため,_foranyクラスはtypedefとして実装されません。
- コードサンプル20-39 IDL配列定義
// IDL typedef long L[10];
- コードサンプル20-40 IDL配列に対して生成された_foranyクラス
// C++ class L_forany { public: L_forany(); L_forany(L_slice *slice); ~L_forany(); CORBA::Long& operator[ ](CORBA::ULong index); const CORBA::Long& operator[ ]( CORBA::ULong index) const; operator L_slice *(); operator L &() const; operator const L & () const; operator const L& () const; L_forany& operator=(const L_forany obj); ... private: L_slice*_ptr; };
(4) 配列でのメモリ管理
配列に対応するメモリの割り当て,および解放のため,VisiBrokerのIDLコンパイラは四つの関数を生成します。これらの関数を使うと,VisiBroker ORBはnewおよびdelete演算子をオーバーライドしなくてもメモリを管理できます。
- コードサンプル20-41 IDL配列定義
// IDL typedef long L[10];
- コードサンプル20-42 配列メモリの割り当ておよび解放のため生成されたメソッド
// C++ static inline L_slice* L_alloc(); // 配列を動的に割り当てます。 static inline void L_free(L_slice *data); // L_allocを使って割り当てられた // 配列のメモリを解放します。 static inline void L_copy(L_slice *_to, L_slice *_from) // _from配列を_to配列にコピーします。 static inline L_slice *L_dup(const L_slice *_date) // 新しくコピーされた_date配列を返します。