IDL定義で構造データ型を記述した場合、データ操作用のクラスおよびメンバ関数が生成されます。
構造データ型には、以下の3つがあります。
構造体型
配列型
シーケンス型
(1)マッピング
IDL言語で構造体型structを指定した場合、C++言語でもstructでデータを宣言します。
IDL定義
module M1{ interface I1{ struct f_STRUCT { long ef1; long ef2; }; struct v_STRUCT { long ev1; string ev2; }; long OPE1 ( in f_STRUCT para1, out f_STRUCT para2, inout f_STRUCT para3, in v_STRUCT para4, out v_STRUCT para5, inout v_STRUCT para6); }; };
トランザクションアプリケーション用ヘッダファイル
class M1 { public: class I1 : public virtual TD { public: struct f_STRUCT{ CORBA::Long ef1; CORBA::Long ef2; }; class f_STRUCT_var { public: f_STRUCT_var(); f_STRUCT_var( f_STRUCT* ); f_STRUCT_var( const f_STRUCT & ); f_STRUCT_var( const f_STRUCT_var & ); ~f_STRUCT_var(); f_STRUCT_var &operator=( f_STRUCT * ); f_STRUCT_var &operator=( const f_STRUCT & ); f_STRUCT_var &operator=( const f_STRUCT_var & ); f_STRUCT *operator->() const; operator f_STRUCT*() const; protected: f_STRUCT *_ptr; }; struct v_STRUCT{ CORBA::Long ev1; TD::String_var ev2; }; class v_STRUCT_var { public: v_STRUCT_var(); v_STRUCT_var( v_STRUCT* ); v_STRUCT_var( const v_STRUCT & ); v_STRUCT_var( const v_STRUCT_var & ); ~v_STRUCT_var(); v_STRUCT_var &operator=( v_STRUCT * ); v_STRUCT_var &operator=( const v_STRUCT & ); v_STRUCT_var &operator=( const v_STRUCT_var & ); v_STRUCT *operator->() const; operator v_STRUCT*() const; protected: v_STRUCT *_ptr; }; ・・・ }; ・・・ };
構造体を宣言すると、上記のように“構造体名_var”クラスが生成されます。
(2)メンバ変数/メンバ関数
構造体のポインタ(*_ptr)
デフォルトコンストラクタ
( M1::I1::f_STRUCT_var::f_STRUCT_var()/M1::I1::v_STRUCT_var::v_STRUCT_var() )
インスタンス生成時、新規T*データを作成し初期化します。
(使用例)
// STRUCT_var型のインスタンス宣言
M1::I1::f_STRUCT_var fstr_v;
M1::I1::v_STRUCT_var *vstr_v = new M1::I1::v_STRUCT_var;
// いずれも暗黙のうちにデフォルトコンストラクタが呼ばれる
T*コンストラクタ
( M1::I1::f_STRUCT_var::f_STRUCT_var( f_STRUCT * )/M1::I1::v_STRUCT_var::v_STRUCT_var( v_STRUCT * ) )
インスタンス生成時、パラメタで指定されたTポインタをメンバ変数_ptrに設定します。
(使用例)
M1::I1::f_STRUCT_var *fstr_v1 = new M1::I1::f_STRUCT_var;
// fstr_v1を使用した処理
・・・
M1::I1::f_STRUCT_var fstr_v2(fstr_v1);
// T*コンストラクタ
コピーコンストラクタ
( M1::I1::f_STRUCT_var::f_STRUCT_var( const f_STRUCT & )/M1::I1::v_STRUCT_var::v_STRUCT_var ( const v_STRUCT & ) )
インスタンス生成時、指定されたパラメタの_ptrのデータのコピーを作成し、自身の_ptrに設定します。
(使用例)
M1::I1::f_STRUCT fstr_v1;
// fstr_v1を使用した処理
・・・
M1::I1::f_STRUCT_var fstr_v2(fstr_v1);
// コピーコンストラクタ
コピーコンストラクタ(var型)
( M1::I1::f_STRUCT_var::f_STRUCT_var( const f_STRUCT_var & )/M1::I1::v_STRUCT_var::v_STRUCT_var ( const v_STRUCT_var & ) )
インスタンス生成時、指定されたパラメタの_ptrのデータのコピーを作成し、自身の_ptrに設定します。
(使用例)
M1::I1::f_STRUCT_var fstr_v1;
// fstr_v1を使用した処理
・・・
M1::I1::f_STRUCT_var fstr_v2(fstr_v1);
// コピーコンストラクタ
デストラクタ
( M1::I1::f_STRUCT_var::~f_STRUCT_var ()/M1::I1::v_STRUCT_var::~v_STRUCT_var() )
インスタンス破壊時、_ptrの領域を解放します。
T*代入演算子
( M1::I1::f_STRUCT_var & M1::I1::f_STRUCT_var::operator=( f_STRUCT * )/M1::I1::v_STRUCT_var & M1::I1::v_STRUCT_var::operator=( v_STRUCT * ) )
(使用例)
M1::I1::f_STRUCT *fstr_1 = new M1::I1::f_STRUCT;
// fstr_1を使用した処理
・・・
M1::I1::f_STRUCT_var fstr_v2;
fstr_v2 = fstr_1;
// T*代入演算子
代入演算子
( M1::I1::f_STRUCT_var & M1::I1::f_STRUCT_var::operator=( const f_STRUCT & )/M1::I1::v_STRUCT_var &M1::I1::v_STRUCT_var::operator=( const v_STRUCT & ) )
(使用例)
const M1::I1::f_STRUCT *fstr_1 = new M1::I1::f_STRUCT;
// fstr_1を使用した処理
・・・
M1::I1::f_STRUCT_var fstr_v2 = fstr_1;
// 代入演算子
代入演算子(var型)
( M1::I1::f_STRUCT_var &M1::I1::f_STRUCT_var::operator=( const f_STRUCT_var & )/M1::I1::v_STRUCT_var &M1::I1::v_STRUCT_var::operator=( const M1::I1::v_STRUCT_var & ) )
(使用例)
M1::I1::f_STRUCT *fstr_1 = new M1::I1::f_STRUCT;
// fstr_1を使用した処理
・・・
M1::I1::f_STRUCT_var fstr_v2;
fstr_v2 = fstr_1;
M1::I1::f_STRUCT_var fstr_v3 = fstr_v2;
// 代入演算子
交換演算子
( M1::I1::f_STRUCT_var::operator M1::I1::f_STRUCT*() const/M1::I1::v_STRUCT_var::operator M1::I1::v_STRUCT*() const )
(使用例)
M1::I1::f_STRUCT *fstr_1 = new M1::I1::f_STRUCT;
// fstr_1を使用した処理
・・・
M1::I1::f_STRUCT_var fstr_v2;
fstr_v2 = fstr_1;
M1::I1::f_STRUCT_var *fstr_v3 = (M1::I1::f_STRUCT*)fstr_v2;
// 交換演算子
ポインタ演算子
( M1::I1::f_STRUCT *M1::I1::f_STRUCT_var::operator->() const/M1::I1::v_STRUCT *M1::I1::v_STRUCT_var::operator->() const )
(使用例)
M1::I1::f_STRUCT *fstr_1 = new M1::I1::f_STRUCT;
fstr_1->ef1 = 1;
fstr_1->ef2 = 2;
M1::I1::f_STRUCT_var fstr_v2;
fstr_v2 = fstr_1;
fstr_v2->ef1 = 3;
fstr_v2->ef2 = 4;
// ポインタ演算子
(3)領域獲得/解放
inパラメタ …領域を獲得、および解放するための特別な関数を使用する必要はありません。
outパラメタ …領域を獲得、および解放するための特別な関数を使用する必要はありません。
inoutパラメタ…領域を獲得、および解放するための特別な関数を使用する必要はありません。
inパラメタ …領域を獲得、および解放するための特別な関数を使用する必要はありません。
outパラメタ …構造体の領域はC++言語のnew演算子、可変長のデータ領域は可変長データ域獲得関数(TD::string_alloc())によって行います。なお、ここで獲得した領域はスケルトンにより解放されます。
inoutパラメタ…領域を獲得、および解放するための特別な関数を使用する必要はありません
(1)マッピング
IDL言語で配列を指定した場合、C++言語でも配列でデータを宣言します。
IDL定義
module M1 { interface I1 { typedef long FARRAY[10]; typedef string VARRAY[10]; ・・・ }; };
トランザクションアプリケーション用ヘッダファイル
class M1 { public: class I1 : public virtual TD { public:
typedef CORBA::Long FARRAY[10]; typedef CORBA::Long FARRAY_slice; class FARRAY_var { public: FARRAY_var(); FARRAY_var( FARRAY_slice* ); FARRAY_var( const FARRAY_var & ); ~FARRAY_var(); FARRAY_var &operator=( FARRAY_slice* ); FARRAY_var &operator=( const FARRAY_var & ); operator FARRAY_slice*() const; FARRAY_slice &operator[]( CORBA::ULong ); FARRAY_slice &operator[]( CORBA::ULong ) const; protected: FARRAY_slice *_ptr; }; static FARRAY_slice *FARRAY_alloc(); static void FARRAY_free( FARRAY_slice * ); typedef TD::String_var VARRAY[10]; typedef TD::String_var VARRAY_slice; class M1::I1::VARRAY_var { public: VARRAY_var(); VARRAY_var( VARRAY_slice* ); VARRAY_var( const VARRAY_var & ); ~VARRAY_var(); VARRAY_var &operator=( VARRAY_slice* ); VARRAY_var &operator=( const VARRAY_var & ); operator VARRAY_slice*() const; VARRAY_slice &operator[]( CORBA::ULong ); VARRAY_slice &operator[]( CORBA::ULong ) const; protected: VARRAY_slice *_ptr; }; static VARRAY_slice *VARRAY_alloc(); static void VARRAY_free( VARRAY_slice * ); ・・・ }; ・・・ };
(2)メンバ変数/メンバ関数
配列領域獲得関数
( M1::I1::FARRAY_slice * M1::I1::FARRAY_alloc()/ M1::I1::VARRAY_slice * M1::I1::VARRAY_alloc() )
IDL定義で記述された配列の領域を獲得します。
(使用例)
M1::I1::FARRAY_slice *fix = M1::I1::FARRAY_alloc();
M1::I1::VARRAY_slice *var = M1::I1::VARRAY_alloc();
配列領域解放関数
( void M1::I1::FARRAY_free( M1::I1::FARRAY_slice * )/ void M1::I1::VARRAY_free( M1::I1::VARRAY_slice * ) )
配列領域獲得関数、および、配列要素複写関数で獲得した領域を解放します。
(使用例)
M1::I1::FARRAY_slice *fix = M1::I1::FARRAY_alloc();
M1::I1::VARRAY_slice *var = M1::I1::VARRAY_alloc();
// fix,varを使用した処理
・・・
M1::I1::FARRAY_free(fix);
M1::I1::VARRAY_free(var);
(3)配列_varクラスのメンバ変数/メンバ関数
配列を宣言すると、“配列名_var”クラスが生成されます。
配列のポインタ(*_ptr)
デフォルトコンストラクタ
( M1::I1::FARRAY_var::FARRAY_var()/M1::I1::VARRAY_var::VARRAY_var() )
インスタンス生成時、新規T*データを作成し初期化します。
(使用例)
// 配列_var型のインスタンス宣言
M1::I1::FARRAY_var farr_v;
M1::I1::FARRAY_var *farr_v = new M1::I1::FARRAY_var;
// いずれも暗黙のうちにデフォルトコンストラクタが呼ばれる
T*コンストラクタ
( M1::I1::FARRAY_var::FARRAY_var( M1::I1::FARRAY_slice* )/M1::I1::VARRAY_var::VARRAY_var( M1::I1::VARRAY_slice * ) )
インスタンス生成時、パラメタで指定されたTポインタをメンバ変数_ptrに設定します。
(使用例)
M1::I1::FARRAY_var *farr_v1 = new M1::I1::FARRAY_var;
// farr_v1を使用した処理
・・・
M1::I1::FARRAY_var farr_v2(farr_v1);
// T*コンストラクタ
コピーコンストラクタ
( M1::I1::FARRAY_var::FARRAY_var( const M1::I1::FARRAY_var & )/M1::I1::VARRAY_var::VARRAY_var( const M1::I1::VARRAY_var & ) )
インスタンス生成時、指定されたパラメタの_ptrのデータのコピーを作成し、自身の_ptrに設定します。
(使用例)
M1::I1::FARRAY_var farr_v1;
// farr_v1を使用した処理
・・・
M1::I1::FARRAY_var farr_v2(farr_v1);
// コピーコンストラクタ
デストラクタ
( M1::I1::FARRAY_var::~FARRAY_var()/M1::I1::VARRAY_var::~VARRAY_var() )
インスタンス破壊時、_ptrの領域を解放します。
T*代入演算子
( M1::I1::FARRAY_var &M1::I1::FARRAY_var::operator=( M1::I1::FARRAY_slice * )/ M1::I1::VARRAY_var &M1::I1::VARRAY_var::operator=( M1::I1::VARRAY_slice * ) )
(使用例)
M1::I1::FARRAY *farr_1 = new M1::I1::FARRAY;
// farr_1を使用した処理
・・・
M1::I1::FARRAY_var farr_v2;
farr_v2 = farr_1;
// T*代入演算子
代入演算子
( M1::I1::FARRAY_var &M1::I1::FARRAY_var::operator=( const FARRAY_var & )/M1::I1::VARRAY_var &M1::I1::VARRAY_var::operator=( const VARRAY_var & ) )
(使用例)
M1::I1::FARRAY *farr_1 = new M1::I1::FARRAY;
// farr_1を使用した処理
・・・
M1::I1::FARRAY_var farr_v2;
farr_v2 = farr_1;
M1::I1::FARRAY_var farr_v3 = farr_v2;
// 代入演算子
交換演算子
( M1::I1::FARRAY_var::operator M1::I1::FARRAY_slice *() const/M1::I1::VARRAY_var::operator M1::I1::VARRAY_slice *() const )
(使用例)
M1::I1::FARRAY *farr_1 = new M1::I1::FARRAY;
// farr_1を使用した処理
・・・
M1::I1::FARRAY_var farr_v2;
farr_v2 = farr_1;
M1::I1::FARRAY_var *farr_v3 = (M1::I1::FARRAY*)farr_v2;
// 交換演算子
添字演算子
( M1::I1::FARRAY_slice &M1::I1::FARRAY_var::operator[]( CORBA::ULong index )/M1::I1::VARRAY_slice &M1::I1::VARRAY_var::operator[]( CORBA::ULong index ) )
(使用例)
M1::I1::FARRAY_slice *farr_1;
farr_1 = FARRAY_alloc();
// farr_1を使用した処理
・・・
M1::I1::FARRAY_var farr_v1;
farr_v1 = farr_1;
long d = varr_1[0]; // 交換演算子
添字演算子(constあり)
( M1::I1::FARRAY_slice &M1::I1::FARRAY_var::operator[]( CORBA::ULong ) const / M1::I1::VARRAY_slice &M1::I1::VARRAY_var::operator[]( CORBA::ULong ) const
(使用例)
M1::I1::FARRAY_slice *farr_1;
farr_1 = FARRAY_alloc();
// farr_1を使用した処理
・・・
const M1::I1::FARRAY_var farr_v1;
farr_v1 = farr_1;
const long d = varr_1[0]; // 添字演算子
(4)領域獲得/解放
inパラメタ …領域を獲得、および解放するための特別な関数を使用する必要はありません。
outパラメタ …領域を獲得、および解放するための特別な関数を使用する必要はありません。
inoutパラメタ…領域を獲得、および解放するための特別な関数を使用する必要はありません。
inパラメタ …領域を獲得、および解放するための特別な関数を使用する必要はありません。
outパラメタ …配列領域獲得関数によりデータ域の獲得を行います。なお、ここで獲得した領域はスケルトンにより解放されます。
inoutパラメタ…領域を獲得、および解放するための特別な関数を使用する必要はありません。
(1)マッピング
IDL言語でシーケンス型sequenceを指定した場合、C++言語では_maximum(最大長)、_length(シーケンス長)、_buffer(バッファポインタ)をprivateデータに持ったC++のクラスにマッピングします。
module M1 { interface I1 { typedef sequence <long> SequenceLong; ・・・ }; interface I2 { typedef sequence <string> SequenceStr; ・・・ }; interface I3 { typedef sequence <string,10> BSequenceStr; ・・・ }; };
class M1 { public: class I1 : public virtual TD { public: class SequenceLong { public: SequenceLong(); SequenceLong( CORBA::ULong ); SequenceLong( CORBA::ULong max, CORBA::ULong length, CORBA::Long *data, CORBA::Boolean release = CORBA_TRUE ); SequenceLong( const SequenceLong &s ); ~SequenceLong(); static CORBA::Long *allocbuf( CORBA::ULong ); static void freebuf( CORBA::Long* ); SequenceLong &operator=( const SequenceLong &s ); CORBA::ULong maximum() const; void length( CORBA::ULong ); CORBA::ULong length() const; CORBA::Long &operator[]( CORBA::ULong index ); const CORBA::Long &operator[]( CORBA::ULong index ) const; private:
CORBA::ULong _maximum; CORBA::ULong _length; CORBA::Long *_buffer; CORBA::Boolean _release; CORBA::Long wkrtn; }; class SequenceLong_var { public: SequenceLong_var(); SequenceLong_var( SequenceLong_ptr ); SequenceLong_var( const SequenceLong_var & ); ~SequenceLong_var(); SequenceLong_var &operator=( SequenceLong_ptr ); SequenceLong_var &operator=( const SequenceLong_var & ); operator SequenceLong_ptr() const; operator SequenceLong_ptr&(); SequenceLong_ptr operator->() const; CORBA::Long &operator[]( CORBA::ULong ); const CORBA::Long &operator[]( CORBA::ULong ) const; protected: SequenceLong *_ptr; CORBA::Long wkrtn; }; }; class I2 : public virtual TD { public: class SequenceStr { public: SequenceStr(); SequenceStr( CORBA::ULong ); SequenceStr( CORBA::ULong max, CORBA::ULong length, TD::String_var *data, CORBA::Boolean release = CORBA_TRUE ); SequenceStr( const SequenceStr &s ); ~SequenceStr(); static TD::String_var *allocbuf( CORBA::ULong ); static void freebuf( TD::String_var* ); SequenceStr &operator=( const SequenceStr &s ); CORBA::ULong maximum() const; void length( CORBA::ULong ); CORBA::ULong length() const;
TD::String_var &operator[]( CORBA::ULong index );
const TD::String_var &operator[]( CORBA::ULong index ) const;
private:
CORBA::ULong _maximum; CORBA::ULong _length; TD::String_var *_buffer; CORBA::Boolean _release; TD::String_var *wkrtn; }; class SequenceStr_var {
public: SequenceStr_var(); SequenceStr_var( SequenceStr_ptr ); SequenceStr_var( const SequenceStr_var & ); ~SequenceStr_var(); SequenceStr_var &operator=( SequenceStr_ptr ); SequenceStr_var &operator=( const SequenceStr_var & ); operator SequenceStr_ptr() const; operator SequenceStr_ptr&(); SequenceStr_ptr operator->() const; TD::String_var &operator[]( CORBA::ULong ); const TD::String_var &operator[]( CORBA::ULong ) const; protected: SequenceStr *_ptr; TD::String_var *wkrtn; }; }; class I3 : public virtual TD { public: class BSequenceStr { public: BSequenceStr(); BSequenceStr( CORBA::ULong length, TD::String_var *data, CORBA::Boolean release = CORBA_TRUE ); BSequenceStr( const BSequenceStr &s ); ~BSequenceStr(); static TD::String_var *allocbuf( CORBA::ULong ); static void freebuf( TD::String_var* ); BSequenceStr &operator=( const BSequenceStr &s ); CORBA::ULong maximum() const; void length( CORBA::ULong ); CORBA::ULong length() const; TD::String_var &operator[]( CORBA::ULong index ); const TD::String_var &operator[]( CORBA::ULong index ) const; private: const CORBA::ULong _maximum; CORBA::ULong _length; TD::String_var *_buffer; CORBA::Boolean _release; TD::String_var *wkrtn; }; class BSequenceStr_var { public: BSequenceStr_var(); BSequenceStr_var( BSequenceStr_ptr ); BSequenceStr_var( const BSequenceStr_var & ); ~BSequenceStr_var(); BSequenceStr_var &operator=( BSequenceStr_ptr ); BSequenceStr_var &operator=( const BSequenceStr_var & ); operator BSequenceStr_ptr() const; operator BSequenceStr_ptr&(); BSequenceStr_ptr operator->() const; TD::String_var &operator[]( CORBA::ULong ); const TD::String_var &operator[]( CORBA::ULong ) const; protected: BSequenceStr *_ptr; TD::String_var *wkrtn; }; ・・・ }; ・・・ };
(2)メンバ変数/メンバ関数
配列の最大個数(_maximum)
使用する配列の個数(_length)
配列の値(_buffer)
リリースフラグ(_release)
未サポート。CORBA_TRUEだけが設定可能です。
デフォルトコンストラクタ
(M1::I1::SequenceLong::SequenceLong() / M1::I2::SequenceStr::SequenceStr() / M1::I3::BSequenceStr::BSequenceStr())
インスタンス生成時、シーケンス長_lengthを0で初期化します。また、サイズ指定ありのシーケンスの場合、最大長_maximumは0で初期化し、最大値が指定されたバウンディッド・シーケンスの場合、最大長_maximumは指定された最大値を設定します。
(使用例)
// 固定長データ
M1::I1::SequenceLong *seq1 = new M1::I1::SequenceLong;
// デフォルトコンストラクタSequenceLongが呼ばれ
// seq1が初期化されます。
// 可変長データ
M1::I2::SequenceStr *seq2 = new M1::I2::SequenceStr;
// デフォルトコンストラクタSequenceStrが呼ばれ
// seq2が初期化されます。
// 可変長データ(最大値が指定されたバウンディッド・シーケンス)
M1::I3::BSequenceStr *seq3 = new M1::I3::BSequenceStr;
// デフォルトコンストラクタBSequenceStrが呼ばれ
// seq3が初期化されます。
maximumコンストラクタ
( M1::I1::SequenceLong::SequenceLong( CORBA::ULong max) / M1::I2::SequenceStr::SequenceStr( CORBA::ULong max ) )
インスタンス生成時、サイズ指定なしのシーケンスの場合、最大長_maximumを0で初期化します。
(使用例)
// 固定長データ
M1::I1::SequenceLong *seq1 = new M1::I1::SequenceLong(10);
// maximumコンストラクタが呼ばれ
// seq1の最大長が10に設定される
// 可変長データ M1::I2::SequenceStr *seq2 = new M1::I2::SequenceStr(11); // maximumコンストラクタが呼ばれ // seq1の最大長が11に設定される
T *dataコンストラクタ
( M1::I1::SequenceLong::SequenceLong( CORBA::ULong max, CORBA::ULong length, CORBA::Long *data, CORBA::Boolean release ) / M1::I2::SequenceStr::SequenceStr( CORBA::ULong max, CORBA::ULong length, TD::String_var *data, CORBA::Boolean release ) / M1::I3::BSequenceStr::BSequenceStr( CORBA::ULong length, TD::String_var *data, CORBA::Boolean release ) )
インスタンス生成時、サイズ指定あり/なしの両方において、パラメタで指定したシーケンス長、最大長およびバッファポインタを_length、_maximum、_bufferに設定します。ただし、最大値が指定されたバウンディッド・シーケンスの場合、_maximumは指定された最大値を設定します。
(使用例)
// 固定長データ
long data[] = {1,2,3,4,5};
M1::I1::SequenceLong seq1(10,5,data,CORBA_TRUE);
// T *dataコンストラクタが呼ばれ、
// パラメタで指定した値で初期化される
// 可変長データ
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I2::SequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I2::SequenceStr seq1(10,4,wkdata,CORBA_TRUE);
// T *dataコンストラクタが呼ばれ、
// パラメタで指定した値で初期化される
// 可変長データ(最大値が指定されたバウンディッド・シーケンス)
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I3::BSequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I3::BSequenceStr seq1(4,wkdata,CORBA_TRUE);
// T *dataコンストラクタが呼ばれ、
// パラメタで指定した値で初期化される
コピーコンストラクタ
( M1::I1::SequenceLong::SequenceLong( const SequenceLong & ) / M1::I2::SequenceStr::SequenceStr( const SequenceStr & ) / M1::I3::BSequenceStr::BSequenceStr( const BSequenceStr & ) )
インスタンス生成時、パラメタで指定された値を_length、_maximum、_bufferに設定します。ただし、最大値が指定されたバウンディッド・シーケンスの場合、_maximumは指定された最大値を設定します。
(使用例)
// 固定長データ
long data[] = {1,2,3,4,5};
M1::I1::SequenceLong s1(10,5,data,CORBA_TRUE);
M1::I1::SequenceLong s2(s1);
// コピーコンストラクタが呼ばれ、s1のデータがs2にコピーされる
// 可変長データ
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I2::SequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I2::SequenceStr seq1(10,4,wkdata,CORBA_TRUE);
M1::I2::SequenceStr seq2(seq1);
// コピーコンストラクタが呼ばれ、seq1のデータがseq2にコピーされる
// 可変長データ(最大値が指定されたバウンディッド・シーケンス)
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I3::BSequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I3::BSequenceStr seq1(4,wkdata,CORBA_TRUE);
M1::I3::BSequenceStr seq2(seq1);
// コピーコンストラクタが呼ばれ、seq1のデータがseq2にコピーされる
デストラクタ
( M1::I1::SequenceLong::~SequenceLong() / M1::I2::SequenceStr_var::~SequenceStr() / M1::I3::BSequenceStr::~BSequenceStr())
インスタンス破壊時、_bufferの値に対する領域を解放します。
配列領域獲得関数
( CORBA::Long * M1::I1::SequenceLong::allocbuf( CORBA::ULong ) / TD::String_var * M1::I2::SequenceStr::allocbuf( CORBA::ULong ) / TD::String_var * M1::I3::BSequenceStr::allocbuf( CORBA::ULong ) )
T *dataコンストラクタに渡すことができるシーケンスの要素の配列を割り当てます。
(使用例)
// 固定長データ
CORBA::Long *data1 = M1::I1::SequenceLong::allocbuf(5);
//data1を使用する処理
・
M1::I1::SequenceLong::freebuf(data1);
// 獲得した配列の領域を解放する
// 可変長データ
TD::String_var *data2 = M1::I2::SequenceStr::allocbuf(4);
//data2を使用する処理
・
M1::I2::SequenceStr::freebuf(data2);
// 獲得した配列の領域を解放する
// 可変長データ(最大値が指定されたバウンディッド・シーケンス) TD::String_var *data3 = M1::I3::BSequenceStr::allocbuf(4); // 4つの配列領域を獲得する
配列領域解放関数
( static void M1::I1::SequenceLong::freebuf( CORBA::Long* ) / static void M1::I2::SequenceStr::freebuf(TD::String_var *) / M1::I3::BSequenceStr::freebuf( TD::String_var * ) )
allocbuf関数によって割り当てられた配列を解放します。
(使用例)
// 固定長データ
CORBA::Long *data1 = M1::I1::SequenceLong::allocbuf(5);
//data1を使用する処理
M1::I1::SequenceLong::freebuf(data1);
// 獲得した配列の領域を解放する
// 可変長データ
TD::String_var *data2 = M1::I2::SequenceStr::allocbuf(4);
//data2を使用する処理
M1::I2::SequenceStr::freebuf(data2);
// 獲得した配列の領域を解放する
// 可変長データ(最大値が指定されたバウンディッド・シーケンス)
TD::String_var *data3 = M1::I3::BSequenceStr::allocbuf(4);
//data2を使用する処理
M1::I3::BSequenceStr::freebuf(data3);
// 獲得した配列の領域を解放する
代入演算子
( M1::I1::SequenceLong &M1::I1::SequenceLong::operator=( const SequenceLong & ) / M1::I2::SequenceStr &M1::I2::SequenceStr::operator(const SequenceStr & ) / M1::I3::BSequenceStr &M1::I3::BSequenceStr::operator=(const BSequenceStr & ) )
パラメタで指定された値を_bufferに設定します。
(使用例)
// 固定長データ
long data[] = {1,2,3,4,5};
M1::I1::SequenceLong s1(10,5,data,CORBA_TRUE);
M1::I1::SequenceLong s2;
s2 = s1; // 代入演算子が呼ばれ、s1のデータがs2にコピーされる
// 可変長データ
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I2::SequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I2::SequenceStr seq1(10,4,wkdata,CORBA_TRUE);
M1::I2::SequenceStr seq2;
seq2 = seq1; // 代入演算子が呼ばれ、seq1のデータがseq2にコピーされる
// 可変長データ(最大値が指定されたバウンディッド・シーケンス)
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I3::BSequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I3::BSequenceStr seq1(4,wkdata,CORBA_TRUE);
M1::I3::BSequenceStr seq2;
seq2 = seq1; // 代入演算子が呼ばれ、seq1のデータがseq2にコピーされる
maximum()アクセス関数(maximum獲得)
( CORBA::ULong M1::I1::SequenceLong::maximum() const / CORBA::ULong M1::I2::SequenceStr::maximum() const / CORBA::ULongM1::I3::BSequenceStr::maximum() const)
サイズ指定のないシーケンスの場合、現在使用可能なバッファの総数を返します。サイズが指定されたシーケンスの場合、IDLで与えられたシーケンスの大きさを返します。
(使用例)
// 固定長データ
CORBA::ULong max;
M1::I1::SequenceLong s1(5);
max = s1.maximum(); // maxの値は5
// 可変長データ
M1::I2::SequenceStr s2(4);
max = s2.maximum() ; // maxの値は4
// 可変長データ(最大値が指定されたバウンディッド・シーケンス)
M1::I3::BSequenceStr s3; //デフォルトコンストラクタで最大値に10が設定される
max = s3.maximum() ; // maxの値は10
length()アクセス関数(length設定)
( void M1::I1::SequenceLong::length( CORBA::ULong ) / void M1::I2::SequenceStr::length( CORBA::ULong ) / void M1::I3::BSequenceStr::length( CORBA::ULong ) )
length(Ulong)関数はパラメタで指定した値をシーケンス長に設定します。
(使用例)
// 固定長データ
long data[] = {1,2,3,4,5};
M1::I1::SequenceLong s1(10,5,data,CORBA_TRUE);
s1.length(5); //シーケンス長を5に設定
// 可変長データ
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I2::SequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I2::SequenceStr seq1(10,4,wkdata,CORBA_TRUE);
seq1.length(4) ; //シーケンス長を4に設定
// 可変長データ(最大値が指定されたバウンディッド・シーケンス)
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I3::BSequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I3::BSequenceStr seq1(4,wkdata,CORBA_TRUE);
seq1.length(4) ; //シーケンス長を4に設定
length()アクセス関数(length獲得)
( CORBA::ULong M1::I1::SequenceLong::length() const / CORBA::ULong M1::I2::SequenceStr::length() const / CORBA::ULong M1::I3::BSequenceStr::length() const
シーケンス長を返します
(使用例)
// 固定長データ
CORBA::ULong len;
long data[] = {1,2,3,4,5};
M1::I1::SequenceLong s1(10,5,data,CORBA_TRUE);
len = s1.length(); // lenの値は5
// 可変長データ
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I2::SequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I2::SequenceStr seq1(10,4,wkdata,CORBA_TRUE);
len = seq1.length() ; // lenの値は4
// 可変長データ(最大値が指定されたバウンディッド・シーケンス)
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I3::BSequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I3::BSequenceStr seq1(4,wkdata,CORBA_TRUE);
len = seq1.length() ; // lenの値は4
添字演算子
( CORBA::Long & M1::I1::SequenceLong::operator[]( CORBA::ULong ) / M1::I2::SequenceStr::operator[]( CORBA::ULong ) / TD::String_var &M1::I3::BSequenceStr::operator[]( CORBA::ULong ) )
与えられたインデックスに対応する_bufferの内容を返します。
(使用例)
// 固定長データ
long data[] = {1,2,3,4,5};
M1::I1::SequenceLong s1(10,5,data,CORBA_TRUE);
long l = s1[3]; // lの値は4
// 可変長データ
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I2::SequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I2::SequenceStr seq1(10,4,wkdata,CORBA_TRUE);
TD::String_var d = seq1[3]; // dの値はwednesday
// 可変長データ(最大値が指定されたバウンディッド・シーケンス)
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I3::BSequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I3::BSequenceStr seq1(4,wkdata,CORBA_TRUE);
TD::String_var d = seq1[3]; // dの値はwednesday
添字演算子(constあり)
(const CORBA::Long &M1::I1::SequenceLong::operator[]( CORBA::ULong ) const / const TD::String_var &M1::I2::SequenceStr::operator[](CORBA::ULong ) const / const TD::String_var & M1::I3::BSequenceStr::operator[]( CORBA::ULong ) const )
与えられたインデックスに対応する_bufferの内容を返す。
(使用例)
// 固定長データ
long data[] = {1,2,3,4,5};
M1::I1::SequenceLong s1(10,5,data,CORBA_TRUE);
const M1::I1::SequenceLong s2(s1);
long l = s2[3]; // lの値は4
// 可変長データ
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I2::SequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I2::SequenceStr seq1(10,4,wkdata,CORBA_TRUE);
const M1::I2::SequenceStr seq2(seq1);
const TD::String_var d = seq2[3]; // dの値はwednesday
// 可変長データ(最大値が指定されたバウンディッド・シーケンス) char *data[] = {"sunday","monday","tuesday","wednesday"}; TD::String_var *wkdata = M1::I3::BSequenceStr::allocbuf(4) ; for (cnt = 0;cnt < 4;cnt++) { wkdata[cnt] = (const CORBA::Char *)data[cnt]; } M1::I3::BSequenceStr seq1(4,wkdata,CORBA_TRUE); const M1::I3::BSequenceStr seq2(seq1); const TD::String_var d = seq2[3]; // dの値はwednesday
(3) シーケンス_varクラスのメンバ変数/メンバ関数
シーケンスを宣言すると、“シーケンス名_var”クラスが生成されます。
シーケンスクラスのポインタ(*_ptr)
デフォルトコンストラクタ
( M1::I1::SequenceLong_var::SequenceLong_var() / M1::I2::SequenceStr_var::SequenceStr_var() / M1::I3::BSequenceStr_var::BSequenceStr_var() )
インスタンス生成時、新規T*データを作成し初期化します。
(使用例)
// Sequence_var型のインスタンス宣言
M1::I1::SequenceLong_var seq1;
M1::I1::SequenceLong_var *seq2 = new M1::I1::SequenceLong_var;
// いずれも暗黙のうちにデフォルトコンストラクタが呼ばれる
T*コンストラクタ
( M1::I1::SequenceLong_var::SequenceLong_var( SequenceLong_ptr * ) / M1::I2::SequenceStr_var::SequenceStr_var( SequenceStr_ptr * ) ) / M1::I3::BSequenceStr_var::BSequenceStr_var( BSequenceStr_ptr * ) )
インスタンス生成時、パラメタで指定されたTポインタをメンバ変数_ptrに設定します。
(使用例)
M1::I1::SequenceLong_var *seq1 = new M1::I1::SequenceLong_var;
// seq1を使用した処理
・・・
M1::I1::SequenceLong_var seq2(seq1);
// T*コンストラクタ
コピーコンストラクタ
( M1::I1::SequenceLong_var::SequenceLong_var( const SequenceLong_var & ) / M1::I2::SequenceStr_var::SequenceStr_var( const SequenceStr_var & ) / M1::I3::BSequenceStr_var( const BSequenceStr_var & ) )
インスタンス生成時、指定されたパラメタの_ptrのデータのコピーを作成し、自身の_ptrに設定します。
(使用例)
M1::I1::SequenceLong_var seq1;
// seq1を使用した処理
・・・
M1::I1::SequenceLong_var seq2(seq1);
// コピーコンストラクタ
デストラクタ
( M1::I1::SequenceLong_var::~SequenceLong_var() /M1::I2::SequenceStr_var::~SequenceStr_var() / M1::I3::BSequenceStr_var::~BSequenceStr_var())
インスタンス破壊時、_ptrの領域を解放します。
T*代入演算子
( M1::I1::SequenceLong_var &M1::I1::SequenceLong_var::operator=( SequenceLong_ptr * ) / M1::I2::SequenceStr_var &M1::I2::SequenceStr_var::operator=( SequenceStr_ptr * ) / M1::I3::BSequenceStr_var &M1::I3::BSequenceStr_var::operator=( BSequenceStr_ptr * ) )
(使用例)
M1::I1::SequenceLong *seq1 = new M1::I1::SequenceLong;
// seq1を使用した処理
・・・
M1::I1::SequenceLong_var seq2;
seq2 = seq1;
// T*代入演算子
代入演算子
( M1::I1::SequenceLong_var &M1::I1::SequenceLong_var::operator=( const SequenceLong_var & ) / M1::I2::SequenceStr_var &M1::I2::SequenceStr_var::operator=( const SequenceStr_var & ) / M1::I3::BSequenceStr_var &M1::I3::BSequenceStr_var::operator=( const BSequenceStr_var & ) )
(使用例)
M1::I1::SequenceLong *seq1 = new M1::I1::SequenceLong;
// seq1を使用した処理
・・・
M1::I1::SequenceLong_var seq2;
seq2 = seq1;
M1::I1::SequenceLong_var seq3 = seq2;
// 代入演算子
ポインタ演算子
( M1::I1::SequenceLong *M1::I1::SequenceLong::operator->() const / M1::I2::SequenceStr *M1::I2::SequenceStr::operator->() const / M1::I3::BSequenceStr *M1::I3::BSequenceStr::operator->() const )
(使用例)
M1::I1::SequenceLong *seq1 = new M1::I1::SequenceLong;
seq1->ef1 = 1;
seq1->ef2 = 2;
M1::I1::SequenceLong_var seq_2;
seq2 = seq1;
seq2->ef1 = 3;
seq2->ef2 = 4;
// ポインタ演算子
交換演算子
( operator M1::I1::SequenceLong_ptr *() const / operator M1::I2::SequenceStr_ptr *() const / operator M1::I3::BSequenceStr_ptr *() const )
(使用例)
M1::I1::SequenceLong *seq1 = new M1::I1::SequenceLong;
// seq1を使用した処理
・・・
M1::I1::SequenceLong_var seq2;
seq2 = seq1;
M1::I1::SequenceLong_var *seq3 = (M1::I1::SequenceLong*)seq2;
// 交換演算子
添字演算子 (constなし)
( CORBA::Long &M1::I1::SequenceLong::operator[]( CORBA::ULong ) / TD::String_var &M1::I2::SequenceStr::operator[](CORBA::ULong ) / TD::String_var & M1::I3::BSequenceStr_var::operator[]( CORBA::ULong ) )
与えられたインデックスに対応する_bufferの内容を返します。
(使用例)
// 固定長データ
long data[] = {1,2,3,4,5};
M1::I1::SequenceLong *seq1 = new M1::I1::SequenceLong (10,5,data,CORBA_TRUE);
M1::I1::SequenceLong_var vseq1;
vseq1 = seq1;
long l = vseq1[3]; // lの値は4
// 可変長データ
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I2::SequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I2::SequenceStr *seq1 = new M1::I2::SequenceStr(10,4,wkdata,CORBA_TRUE);
M1::I2::SequenceStr_var vseq1;
vseq1 = seq1;
TD::String_var d =vseq1[3]; // dの値はwednesday
// 可変長データ(最大値が指定されたバウンディッド・シーケンス)
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I3::BSequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I3::BSequenceStr *seq1 = new M1::I3::BSequenceStr(4,wkdata,CORBA_TRUE);
M1::I3::BSequenceStr vseq1;
vseq1 = seq1;
TD::String_var d = vseq1[3]; // dの値はwednesday
添字演算子(constあり)
(const CORBA::Long &M1::I1::SequenceLong::operator[]( CORBA::ULong ) const / const TD::String_var &M1::I2::SequenceStr::operator[](CORBA::ULong ) const / const TD::String_var &M1::I3::BSequenceStr_var::operator[](CORBA::ULong ) const)
与えられたインデックスに対応する_bufferの内容を返す。
(使用例)
// 固定長データ
long data[] = {1,2,3,4,5};
M1::I1::SequenceLong *seq1 = new M1::I1::SequenceLong (10,5,data,CORBA_TRUE);
const M1::I1::SequenceLong_var vseq1(seq1);
const long l = vseq1[3]; // lの値は4
// 可変長データ
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I2::SequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I2::SequenceStr *seq1 = new M1::I2::SequenceStr(10,4,wkdata,CORBA_TRUE);
const M1::I2::SequenceStr vseq1(seq1);
const TD::String_var d = vseq1[3]; // dの値はwednesday
// 可変長データ(最大値が指定されたバウンディッド・シーケンス)
char *data[] = {"sunday","monday","tuesday","wednesday"};
TD::String_var *wkdata = M1::I3::BSequenceStr::allocbuf(4) ;
for (cnt = 0;cnt < 4;cnt++) {
wkdata[cnt] = (const CORBA::Char *)data[cnt];
}
M1::I3::BSequenceStr *seq1 = new M1::I3::BSequenceStr(4,wkdata,CORBA_TRUE);
const M1::I3::BSequenceStr_var vseq1(seq1); const TD::String_var d = vseq1[3]; // dの値はwednesday
(4)領域獲得/解放
inパラメタ …領域を獲得、および解放するための特別な関数を使用する必要はありません。
outパラメタ …領域を獲得、および解放するための特別な関数を使用する必要はありません。
inoutパラメタ…領域を獲得、および解放するための特別な関数を使用する必要はありません。
inパラメタ …領域を獲得、および解放するための特別な関数を使用する必要はありません。
outパラメタ …シーケンスクラスのインスタンスはC++のnew演算子、シーケンスのデータ領域はallocbuf関数(XX::allocbuf())により領域の獲得を行います。なお、ここで獲得した領域はスケルトンにより解放されます。
inoutパラメタ…領域を獲得、および解放するための特別な関数を使用する必要はありません。