next up previous contents
: 自分のクラスを含む共有ライブラリーのロード : クラスの拡張と Dictionary : クラスの拡張と Dictionary   目次

全ては TObject から

C++ インタープリターを内蔵することと、 基底クラスを共有することの強力な点は、 オブジェクトの入出力のためのストリームメソッドが 自動的に生成できることである。 ROOT のクラスを拡張する際に プログラマーがなすべきことは、 まずユーザー定義のクラスヘッダーに


  class MyClass : public TObject {
    ....
    ClassDef(MyClass,1)  // The class title
  }
などと、書いておくこと。 ここで、${\tt 1}$ はバージョン ID である。 バージョン ID はランタイムタイプ ID に必要であり、 クラスのデーターメンバーが変更を受けたら更新する。 バージョン ID を ${\tt0}$ にしておくと、 オブジェクト I/O が不要と見なされ、 ストリーマーメソッドは自動生成されない。

クラスの実装では、


  ClassImp(MyClass)
などと、書いておくこと。

もう一つのポイントは、 かならずデフォールトコンストラクター (引数なしで呼べるコンストラクター)を用意しておくこと。 この際、デフォールトコンストラクター では、データーメンバーなるポインターにメモリーを確保してはいけない。 ROOT ファイルが読み込まれる際に、まず、 デフォールトコンストラクターが呼ばれ、 それからデーターが読み込まれるわけだが、 その際にそのポインターが上書きされ、 もともとそれが指していたオブジェクトは見失われ、 メモリーリークを生じる。

次に ${\tt LinkDef.h}$ なる名前で


  #ifdef __CINT__

  #pragma link off all globals;
  #pragma link off all classes;
  #pragma link off all functions;

  #pragma link C++ class MyClass;

  #endif
のようなファイルを用意する。

これは、 ${\tt Makefile}$ の中で


  MyClassDict.cxx: MyClass.h LinkDef.h
        @echo "Generating dictionary ..."
        rootcint -f MyClassDict.cxx -c MyClass.h LinkDef.h
のように使い、 ${\tt Streamer}$ ${\tt Showmember}$ などを 自動生成してもらう。

後は、 ${\tt MyClass.o}$ ${\tt MyClassDict.o}$ を含めて、 共有ライブラリーを作れば良い。


next up previous contents
: 自分のクラスを含む共有ライブラリーのロード : クラスの拡張と Dictionary : クラスの拡張と Dictionary   目次
Keisuke Fujii 平成12年12月22日