13.3 varクラスの使い方

自動変数varは、メモリー管理を簡単に行うために用意されています。varはvarクラスを通じて提供されます。このクラスは、型に必要なメモリーの所有権を想定し、varオブジェクトのインスタンスが破棄されたり、新しい値がvarオブジェクトに割り当てられたときにメモリーを解放します。

Oracle Tuxedoでは、次の型のvarクラスが用意されています:

  • 文字列(CORBA::String_var)
  • オブジェクト参照(CORBA::Object_var)
  • ユーザー定義のOMG IDLの型(structunionsequencearray、および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_varTYPEを所有している場合、それを解放してから、NewValueパラメータの所有権を想定します。NewValue引数は、このvarクラスが所有するTYPEへのポインタです。このポインタは0(ゼロ)に指定しないでください。
TYPE_var &operator=(const TYPE_var &From);
この代入演算子は、新しいTYPEを割り当てて、From TYPE_varパラメータが所有するTYPEに格納されているデータをディープ・コピーします。現在、TYPE_varTYPEを所有している場合は解放されます。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_varinパラメータを渡すには、in() メンバー関数を呼び出します。inoutパラメータの場合は、inout() メンバー関数を呼び出します。outパラメータの場合は、out()メンバー関数を呼び出します。TYPE_varから戻り値を取得するには、_return()関数を呼び出します。各TYPE_var型について、これらの関数の戻り値の型はそれぞれ、次の表に示すininoutout、および基底の型TYPEの戻り値モードの型にそれぞれ一致します。

ユーザー定義のデータ型でサポートされる演算子には、いくつかの違いがあります。次の表では、生成されたC++コードにおける各OMG IDLのデータ型でサポートされる様々な演算子について説明しています。代入演算子は、次の表に示すすべてのデータ型でサポートされるので、比較には含まれていません。

表13-3 ユーザー定義のデータ型のvarクラスでサポートされる演算子の比較

OMG IDLのデータ型 演算子 -> 演算子 []
struct はい いいえ
union はい いいえ
sequence はい はい(constを除く)
array いいえ はい

シグネチャは、次の表に示すとおりです。

表13-4 _varクラスの演算子のシグネチャ

OMG IDLのデータ型 演算子メンバー関数
struct TYPE * operator-> ()

TYPE * operator-> () const

union TYPE * operator-> ()

TYPE * operator-> () const

sequence TYPE * operator-> ()

TYPE * operator-> () const

TYPE & operator[](CORBA::Long index)

array TYPE_slice & operator[](CORBA::Long index) TYPE_slice & operator[](CORBA::Long index) const