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
のように使い、
後は、
と
を含めて、
共有ライブラリーを作れば良い。