13.1.8 ユニオン

OMG IDLのユニオンは、C++のクラスにマッピングされます。C++クラスには、次のものが格納されています。

  • コンストラクタ
  • デストラクタ
  • 代入演算子
  • ユニオンの値のモディファイア
  • ユニオンの値のアクセサ
  • ユニオンの区別子のモディファイアおよびアクセサ

たとえば、次のOMG IDL定義を考えます:

// OMG IDL
union OrderItem switch (long)
    {
    case 1: itemStruct itemInfo;
    case 2: orderStruct orderInfo;
    default: ID idInfo;
    };

この定義は、次のようにC++にマッピングされます:

// C++
class OrderItem
    {
    public:
       OrderItem();
       OrderItem(const OrderItem &);
       ~OrderItem();

        OrderItem &operator=(const OrderItem&);
      void _d (CORBA::Long);
      CORBA::Long _d () const;

      void itemInfo (const itemStruct &);
      const itemStruct & itemInfo () const;
      itemStruct & itemInfo ();

      void orderInfo (const orderStruct &);
      const orderStruct & orderInfo () const;
      orderStruct & orderInfo ();

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

      . . .
};

デフォルトのユニオン・コンストラクタでは、ユニオンのデフォルト区別子の値は設定されません。そのため、ユニオンの値を設定するまで、ユニオン・アクセサ・メンバー関数を呼び出すことはできません。区別子は、_dメンバー関数でマッピングされる属性です。