| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第5章 アプリケーションの開発(C++言語) | > 5.6 varクラス |
ユーザ定義型データ(シーケンス、構造体、共用体、配列型、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の指す領域を解放します。 |
|
T*代入演算子 |
右辺で指定されたT*ポインタを_ptrに代入します。 |
|
代入演算子 |
右辺で指定されたT_varの_ptrに設定されているデータのコピーを作成し、そのポインタを_ptrに設定します。 |
|
交換演算子 |
_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);
}
目次
索引
![]()
|