13.3 varクラスの使い方
自動変数varは、メモリー管理を簡単に行うために用意されています。varはvarクラスを通じて提供されます。このクラスは、型に必要なメモリーの所有権を想定し、varオブジェクトのインスタンスが破棄されたり、新しい値がvarオブジェクトに割り当てられたときにメモリーを解放します。
Oracle Tuxedoでは、次の型のvarクラスが用意されています:
- 文字列(
CORBA::String_var) - オブジェクト参照(
CORBA::Object_var) - ユーザー定義のOMG IDLの型(
struct、union、sequence、array、およびinterface)
varクラスのメンバー関数は共通ですが、OMG IDLの型によって演算子を追加でサポートする場合があります。OMG IDLの型TYPEの場合、TYPE_varクラスには、コンストラクタ、デストラタ、代入演算子、および基底のTYPE型にアクセスするための演算子が含まれています。次に、varクラスの例を示します。
class TYPE_var
{
public:
// constructors
TYPE_var();
TYPE_var(TYPE *);
TYPE_var(const TYPE_var &);
// destructor
~TYPE_var();
// assignment operators
TYPE_var &operator=(TYPE *);
TYPE_var &operator=(const TYPE_var &);
// accessor operators
TYPE *operator->();
TYPE *operator->() const;
TYPE_var_ptr in() const;
TYPE_var_ptr& inout();
TYPE_var_ptr& out();
TYPE_var_ptr _retn();
operator const TYPE_ptr&() const;
operator TYPE_ptr&();
operator TYPE_ptr;
};メンバー関数の詳細は次のとおりです:
-
TYPE_var() - これは、
TYPE_varクラスのデフォルトのコンストラクタです。このコンストラクタは0(ゼロ)に初期化します。この値は、varクラスがTYPE *を所有することを示します。有効なTYPE *を割り当てていないかぎり、TYPE_varクラスでoperator->を呼び出すことはできません。 -
TYPE_var(TYPE * Value); - このコンストラクタは、指定の
TYPE *パラメータの所有権を想定します。TYPE_varが破棄されると、TYPEは解放されます。Value引数は、このvarクラスが所有するTYPEへのポインタです。このポインタは0(ゼロ)に指定しないでください。 -
TYPE_var(const TYPE_var &From); - このコピー・コンストラクタは、新しい
TYPEを割り当てて、Fromパラメータが所有するTYPEに格納されているデータをディープ・コピーします。TYPE_varが破棄されると、TYPEのコピーは解放または削除されます。Fromパラメータには、コピー元のTYPEを指すvarクラスを指定します。 -
~TYPE_var(); - このデストラクタは、varクラスが所有する
TYPEを適切なメカニズムで解放します。文字列の場合、これはCORBA::string_freeルーチンです。オブジェクト参照の場合、これはCORBA::releaseルーチンです。その他の型の場合、これはdelete、または割当て済メモリーを解放するために生成された静的ルーチンです。 -
TYPE_var &operator=(TYPE * NewValue); - この代入演算子は、
NewValueパラメータが指すTYPEの所有権を想定します。現在、TYPE_varがTYPEを所有している場合、それを解放してから、NewValueパラメータの所有権を想定します。NewValue引数は、このvarクラスが所有するTYPEへのポインタです。このポインタは0(ゼロ)に指定しないでください。 -
TYPE_var &operator=(const TYPE_var &From); - この代入演算子は、新しい
TYPEを割り当てて、FromTYPE_varパラメータが所有するTYPEに格納されているデータをディープ・コピーします。現在、TYPE_varがTYPEを所有している場合は解放されます。TYPE_varが破棄されると、TYPEのコピーは解放されます。Fromパラメータには、コピー元のデータを指すvarクラスを指定します。 -
TYPE *operator->(); TYPE *operator->() const; - これらの演算子は、varクラスが所有している
TYPEへのポインタを返します。varクラスは、引き続きTYPEを所有し、TYPEを解放するのはvarクラスの役割です。varが有効なTYPEを所有するまで、operator->は使用できません。TYPE_varが破棄された後に、この戻り値の解放またはアクセスを試行しないでください。 -
TYPE_var_ptr in() const; TYPE_var_ptr&inout(); TYPE_var_ptr&out(); TYPE_var_ptr _retn(); - 暗黙的な変換を実行すると、一部のC++コンパイラやコードの可読性に問題が生じることがあります。そのため、
TYPE_var型では、パラメータ渡しのために明示的な変換を実行できるようにするメンバー関数もサポートしています。TYPE_varとinパラメータを渡すには、in()メンバー関数を呼び出します。inoutパラメータの場合は、inout()メンバー関数を呼び出します。outパラメータの場合は、out()メンバー関数を呼び出します。TYPE_varから戻り値を取得するには、_return()関数を呼び出します。各TYPE_var型について、これらの関数の戻り値の型はそれぞれ、次の表に示すin、inout、out、および基底の型TYPEの戻り値モードの型にそれぞれ一致します。
ユーザー定義のデータ型でサポートされる演算子には、いくつかの違いがあります。次の表では、生成されたC++コードにおける各OMG IDLのデータ型でサポートされる様々な演算子について説明しています。代入演算子は、次の表に示すすべてのデータ型でサポートされるので、比較には含まれていません。
表13-3 ユーザー定義のデータ型のvarクラスでサポートされる演算子の比較
| OMG IDLのデータ型 | 演算子 -> | 演算子 [] |
|---|---|---|
struct
|
はい | いいえ |
union
|
はい | いいえ |
sequence
|
はい | はい(constを除く) |
array
|
いいえ | はい |
シグネチャは、次の表に示すとおりです。
表13-4 _varクラスの演算子のシグネチャ
| OMG IDLのデータ型 | 演算子メンバー関数 |
|---|---|
struct
|
TYPE * operator-> ()
|
union
|
TYPE * operator-> ()
|
sequence
|
TYPE * operator-> ()
|
array
|
TYPE_slice & operator[](CORBA::Long index) TYPE_slice & operator[](CORBA::Long index) const |
親トピック: OMG IDL文のC++へのマッピング