Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第5章 アプリケーションの開発(C++言語)> 5.6 varクラス

5.6.4 ユーザ定義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*コンストラクタは、インスタンス生成時、パラメタで指定された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*代入演算子は、パラメタで指定された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); 
  }

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005