ユーザ定義型データ(シーケンス、構造体、共用体、配列型、IDLで定義された各インタフェースごとのObjectクラス)は、IDLコンパイラにより、各定義型に応じたクラスとそのクラス名に_varを付けたvarクラスが作成されます。Tをユーザ定義したデータ型名とした場合、このvarクラスには以下のメンバ関数が定義されます。
class T_var { public: T_var(); // デフォルトコンストラクタ T_var( T* ); // T*コンストラクタ T_var( const T_var & ); // コピーコンストラクタ ~T_var(); // デストラクタ T_var &operator=( T* ); // T*代入演算子 T_var &operator=( const T_var & ); // 代入演算子 operator T*()const; // 交換演算子 T* operator->() const; // ポインタ演算子 // 以下はシーケンスの場合のみ T_var &operator[]( CORBA::ULong ); // T(可変長)のsequenceのパラメタ+1番目の要素の取り出し const T_var &operator[]( CORBA::ULong ); // T(可変長)のsequenceのパラメタ+1番目の要素の取り出し T_var &operator[]( CORBA::ULong ); // [ ]演算子 const T &operator[]( CORBA::ULong ); // [ ]演算子 protected: T *ptr; }
T_varクラスのメンバ | 意味 |
---|---|
デフォルトコンストラクタ | インスタンス生成時、新規T*データを作成し初期化します。 |
T*コンストラクタ | インスタンス生成時、パラメタで指定されたTポインタを_ptrに代入します。 |
コピーコンストラクタ | インスタンス生成時、指定されたパラメタの_ptrのデータのコピーを作成し、自身の_ptrに設定します。_ptrの領域を新規獲得します。メモリ不足により領域の獲得に失敗した場合、_ptrがNULLに設定されます。 |
デストラクタ | _ptrの指す領域を解放します。 |
T*代入演算子 | 右辺で指定されたT*ポインタを_ptrに代入します。 |
代入演算子 | 右辺で指定されたT_varの_ptrに設定されているデータのコピーを作成し、そのポインタを_ptrに設定します。_ptrの領域を新規獲得します。メモリ不足により領域の獲得に失敗した場合、_ptrがNULLに設定されます。 |
交換演算子 | _ptrに設定されているデータを取り出します。 |
ポインタ演算子 | _ptrに設定されているデータを取り出します。 |
[ ]演算子 | _ptrに設定されているパラメタ+1番目の要素を取り出します。 |
デフォルトコンストラクタは、インスタンス生成時_ptrに0を設定します。デフォルトコンストラクタの使用例と処理内容を以下に示します。
// IDL struct X { long x; string y; }; // C++ X_var x; X_var::X_var() { _ptr = new X; }
T*コンストラクタは、インスタンス生成時、パラメタで指定されたTポインタを_ptrに代入します。T*コンストラクタの使用例と処理内容を以下に示します。
// IDL struct X { long x; string y; }; typedef sequence<long> LongSeq; // C++ X *data = new X(); data->x = 3; data->y = (const CORBA::Char *)"data"; X_var x( data ); // T*コンストラクタ CORBA::Long *buffer = LongSeq::allocbuf(2); for( int i = 0; i < 2; i++ ) buffer[i] = i; LongSeq *seq = new LongSeq(2,2,buffer,CORBA_TRUE); LongSeq_var seq_var(seq); // T*コンストラクタ X_var::X_var( X *p ) { _ptr = p; } LongSeq_var::Long_var( LongSeq *p ) { _ptr = p; }
コピーコンストラクタは、インスタンス生成時、パラメタで指定されたT_varデータの_ptrのコピーを作成し、自身の_ptrに代入します。コピーコンストラクタの使用例と処理内容を以下に示します。
// IDL struct X { long x; string y; }; typedef sequence<long> LongSeq; // C++ X *data = new X(); data->x = 3; data->y = (const CORBA::Char *)"data"; X_var x_data1( data ); // T*コンストラクタが起動されます。 X_var x_data2( x_data1 ); // コピーコンストラクタが起動されます。 CORBA::Long *buffer = LongSeq::allocbuf(2); for( int i = 0; i < 2; i++ ) buffer[i] = i; LongSeq *seq = new LongSeq(2,2,buffer,CORBA_TRUE); LongSeq_var seq_var1(seq); // T*コンストラクタが起動されます。 LongSeq_var seq_var2( seq_var1 ); // コピーコンストラクタが起動されます。 X_var::X_var( const X_var &r ) { ... // rの_ptrを取り出し、そのコピーを_ptrに設定します。 } LongSeq_var::LongSeq_var( const LongSeq_var &r ) { ... // rの_ptrを取り出し、そのコピーを_ptrに設定します。 }
デストラクタは、インスタンス破壊時、_ptrの指すデータを解放します。デストラクタの使用例と処理内容を以下に示します。
// IDL struct X { long x; string y; }; // C++ X *data = new X(); data->x = 3; data->y = (const CORBA::Char *)"data"; X_var *var_data = new X_var(data); delete var_data; X_var::~X_var() { delete _ptr; }
T*代入演算子は、パラメタで指定されたTポインタを_ptrに代入します。T*代入演算子の使用例と処理内容を以下に示します。
// IDL struct X { long x; string y; }; // C++ X *str_data = new X(); data->x = 3; data->y = (const CORBA::Char *)"data"; X_var x_var; x_var = data; // 代入演算子が起動されます。 X_var::X_var::operator=( T* p) { _ptr = p; }
代入演算子は、パラメタで指定されたT_varの_ptrに設定されているデータのコピーを作成し、_ptrに代入します。代入演算子の使用例と処理内容を以下に示します。
// IDL struct X { long x; string y; }; // C++ X *data = new X(); data->x = 3; data->y = (const CORBA::Char *)"data"; X_var x_var; x_var = data; // T*代入演算子が起動されます。 X_var x_var2 = x_var; // 代入演算子が起動されます。 X_var::X_var::operator=( const X_var &r ) { ... // rの_ptrを取り出し、そのコピーを_ptrに設定します。 }
交換演算子は、_ptrに設定されているデータを取り出します。交換演算子の使用例と処理内容を以下に示します。
// IDL struct X { long x; string y; }; // C++ X *str_data = new X(); data->x = 3; data->y = (const CORBA::Char *)"data"; X_var x_var; x_var = data; // T*代入演算子が起動されます。 X *p = (X *)x_var; // 交換演算子が起動されます。 X * X_var::operator X*() { return _ptr; }
ポインタ演算子は、_ptrに設定されているデータを取り出します。ポインタ演算子の使用例と処理内容を以下に示します。
// IDL struct X { long x; string y; }; // C++ X *data = new X(); data->x = 3; data->y = (const CORBA::Char *)"data"; X_var x_var; x_var = data; // T*代入演算子が起動されます。 CORBA::Long z = x_var->x; // 交換演算子が起動されます。zには、3が代入されます。 x_var->x = 5; // 交換演算子が起動され、_ptrの指す構造体の要素xに5が代入されます。 x_var->y = (const CORBA::Char *)"test"; // 交換演算子が起動され、_ptrの指す構造体の要素yに文字列"test"が代入されます。 X * X_var::operator->() { return _ptr; }
[ ]演算子は、0から数えて[ ]で指定された番号番目の要素を返します。[ ]演算子の使用例と処理内容を以下に示します。
// IDL typedef sequence<long> LongSeq; typedef sequence<string> StringSeq; // C++ CORBA::Long *p = LongSeq::allocbuf(2); p[0] = 2; p[1] = 3; LongSeq *long_seq = new LongSeq(2,2,p,CORBA_TRUE); LongSeq_var long_seq_var = long_seq; // 代入演算子 CORBA::Long y = long_seq_var[1]; // [ ]演算子。yには3が代入されます。 CORBA::String_var *q = StringSeq::allocbuf(2); q[0] = (const CORBA::Char *)"test"; q[1] = (const CORBA::Char *)"data"; StringSeq *str_seq = new StringSeq(2,2,q,CORBA_TRUE); StringSeq_var str_seq_var = str_seq; // 代入演算子 CORBA::String_var str = str_seq_var[1]; // strの_ptrには、"data"が代入されます。 CORBA::Long & LongSeq_var::operator[](CORBA::ULong index) { return _ptr->operator[]( index ); } CORBA::String_var & StringSeq_var::operator[](CORBA::ULong index) { return (const CORBA::String_var &) _ptr->operator[](index); }