13.1.8.1 ユニオン・メンバーのアクセサ・メンバー関数とモディファイア・メンバー関数のマッピング

ユニオンのメンバーごとに、アクセサ・メンバー関数とモディファイア・メンバー関数が生成されます。

前の例から抜粋した次のコードでは、IDメンバー関数に対して2つのメンバー関数が生成されます:

void idInfo (ID);
ID idInfo () const;

この例では、最初の関数(モディファイア)で区別子をデフォルト値に、ユニオンの値を指定のID値に設定しています。2番目の関数(アクセサ)では、ユニオンの値を返しています。

ユニオン・メンバーのデータtypeによっては、モディファイア関数がさらに生成されます。各データtypeに対して生成されるメンバー関数は次のとおりです:

  • 基本データ型 - short、long、unsigned short、unsigned long、float、double、char、boolean、およびoctet

    次の例では、メンバー名basictypeを持つ基本データtypeに対して2つのメンバー関数を生成します:
    void basictype (TYPE);     // modifier
    TYPE basictype () const;   // accessor

    OMG IDLデータtypeからC++データtype TYPEへのマッピングについては、次の表を参照してください。

  • オブジェクトと擬似オブジェクト

    メンバー名がobjtypeのオブジェクト型およびTypecode型の場合、メンバー関数は次のように生成されます:

    void objtype (TYPE); // modifier
    TYPE objtype () const; // accessor

    OMG IDLデータ型からC++データ型TYPEへのマッピングについては、次の表を参照してください。

    修飾子メンバー関数は、指定されたオブジェクト参照引数の所有権を引き受けません。代わりに、モディファイアはオブジェクト参照または擬似オブジェクト参照を複製します。リファレンスが不要になったときは、リファレンスを解放してください。

  • 列挙

    メンバー名がenumtypeの列挙型TYPEの場合、メンバー関数は次のように生成されます:

    void enumtype (TYPE);      // modifier
    TYPE enumtype () const;   // accessor
  • 文字列

    文字列の場合、次のように1つのアクセサ関数と3つのモディファイア関数が生成されます:

    void stringInfo (char *);                        // modifier 1
    void stringInfo (const char *);                 // modifier 2
    void stringInfo (const CORBA::String_var &);   // modifier 3
    const char * stringInfo () const;             // accessor

    最初の修飾子は、渡されたchar *パラメータの所有権を想定し、ユニオンは、ユニオンの値が変更されたとき、またはユニオンが破棄されたときに、この文字列でCORBA::string_freeメンバー関数をコールします。

    2番目と3番目の修飾子は、パラメータで渡された、または文字列varに含まれる指定された文字列のコピーを作成します。

    アクセサ関数は、ユニオンの内部メモリーへのポインタを返します。このメモリーを解放しようとしないでください。また、ユニオン値が変更された後やユニオンが破棄された後にこのメモリーにアクセスしないでください。

  • 構造体、ユニオン、シーケンス、およびany

    これらのデータ型の場合、モディファイア関数およびアクセサ関数は、次のようにtypeへの参照を使用して生成されます:

    void reftype (TYPE &);            // modifier
    const TYPE & reftype () const;    // accessor
    TYPE & reftype ();                // accessor

    モディファイア関数は、入力typeパラメータの所有権を引き受けません。かわりに、この関数はデータtypeのコピーを作成します。

  • 配列

    配列の場合、次に示すように、モディファイア・メンバー関数は配列ポインタを受け付け、アクセサは配列スライスへのポインタを返します:

    void arraytype (TYPE);              // modifier
    TYPE_slice * arraytype () const;   // accessor

    モディファイア関数は、入力typeパラメータの所有権を引き受けません。かわりに、この関数は配列のコピーを作成します。