IDLで指定した配列は,C++配列にマッピングされます。マッピングされた配列を静的に初期化できます。IDL配列要素が文字列またはオブジェクトリファレンスである場合,C++配列ではそれらの要素が_var型となります。コードサンプル20-33~20-34は,異なる要素型を持つ三つの配列を示しています。
// IDL
interface Intf
{
...
};
typedef long L[10];
typedef string S[10];
typedef Intf A[10];
// C++
typedef CORBA::Long L[10];
typedef CORBA::String_var S[10];
typedef Intf_var A[10];
文字列およびオブジェクトリファレンスに対して_varという管理型を使うことによって,配列要素が代入された際にメモリが透過的に管理できます。
array_slice型は複次元配列のパラメタを渡す際に使用されます。一次元配列以外の配列に対して_slice型がVisiBrokerのIDLコンパイラによって生成されます。パラメタを渡したり,返したりする際に,_slice型を使うと便利です。コードサンプル20-35とコードサンプル20-36は,_slice型の例を示しています。
// IDL
typedef long L[10];
typedef string str[1][2][3];
// C++
typedef CORBA::Long L_slice;
typedef CORBA::String_var str_slice[2][3];
VisiBrokerのIDLコンパイラは,IDL配列に対するC++配列だけでなく,_varクラスも生成します。このクラスは,配列の拡張機能を提供します。
// IDL
typedef long L[10];
// 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;
};
any型にマッピングされた要素を持つ配列を処理するために,_foranyという特別なクラスが生成されます。_varクラスと同様に,_foranyクラスでも下位の配列型にアクセスできます。Any型がメモリの所有権を引き受けるので,_foranyクラスは,デストラクトの際にメモリを解放しません。関数を適切にオーバーロードし,ほかの型と見分けられるようにするため,_foranyクラスはtypedefとして実装されません。
// IDL
typedef long L[10];
// 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;
};
配列に対応するメモリの割り当て,および解放のため,VisiBrokerのIDLコンパイラは四つの関数を生成します。これらの関数を使うと,VisiBroker ORBはnewおよびdelete演算子をオーバーライドしなくてもメモリを管理できます。
// IDL
typedef long L[10];
// 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配列を返します。