C++ インタープリターを内蔵することと、 基底クラスを共有することの強力な点は、 オブジェクトの入出力のためのストリームメソッドが 自動的に生成できることである。 ROOT のクラスを拡張する際に プログラマーがなすべきことは、 まずユーザー定義のクラスヘッダーに
class MyClass : public TObject { .... ClassDef(MyClass,1) // The class title }などと、書いておくこと。 ここで、
クラスの実装では、
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のように使い、
後は、
と
を含めて、
共有ライブラリーを作れば良い。