C++ インタープリターを内蔵することと、 基底クラスを共有することの強力な点は、 オブジェクトの入出力のためのストリームメソッドが 自動的に生成できることである。 ROOT のクラスを拡張する際に プログラマーがなすべきことは、 まずユーザー定義のクラスヘッダーに
class MyClass : public TObject { .... ClassDef(MyClass,1) // The class title }などと、書いておくこと。 ここで、 はバージョン ID である。 バージョン ID はランタイムタイプ ID に必要であり、 クラスのデーターメンバーが変更を受けたら更新する。 バージョン ID を にしておくと、 オブジェクト I/O が不要と見なされ、 ストリーマーメソッドは自動生成されない。
クラスの実装では、
ClassImp(MyClass)などと、書いておくこと。
もう一つのポイントは、 かならずデフォールトコンストラクター (引数なしで呼べるコンストラクター)を用意しておくこと。 この際、デフォールトコンストラクター では、データーメンバーなるポインターにメモリーを確保してはいけない。 ROOT ファイルが読み込まれる際に、まず、 デフォールトコンストラクターが呼ばれ、 それからデーターが読み込まれるわけだが、 その際にそのポインターが上書きされ、 もともとそれが指していたオブジェクトは見失われ、 メモリーリークを生じる。
次に なる名前で
#ifdef __CINT__ #pragma link off all globals; #pragma link off all classes; #pragma link off all functions; #pragma link C++ class MyClass; #endifのようなファイルを用意する。
これは、 の中で
MyClassDict.cxx: MyClass.h LinkDef.h @echo "Generating dictionary ..." rootcint -f MyClassDict.cxx -c MyClass.h LinkDef.hのように使い、 や などを 自動生成してもらう。
後は、 と を含めて、 共有ライブラリーを作れば良い。