C++ による BREW 開発(9)
仮想テーブルの初期化を C++ で行うとどうなるか。
とりあえず、C++ でオブジェクトを作成するには new 演算子を使う。
この場合だと、MALLOC() によって余分に確保した、仮想テーブルの領域が無い。
仮想テーブルをコンストラクタで new するのが一番ベターかもしれない。
class CApplet : public IApplet{ public: CApplet(){ this->pvt = new IAppletVtbl(); this->pvt->AddRef = AEEApplet_AddRef; this->pvt->Release = AEEApplet_Release; .... } };
ただし、これだと IAppletVtbl を new したときにメモリが足りない可能性があるのと、2つのメモリ領域を取るので、メモリのフラグメンテーションが早く進行してしまうことになる。
なので、あらかじめメンバに IAppletVtbl の実体を持っておくべきだろう。
class CApplet : public IApplet{ public: CApplet(){ _vtIApplet.AddRef = AEEApplet_AddRef; _vtIApplet.Release = AEEApplet_Release; _vtIApplet.HandleEvent = AEEApplet_HandleEvent; this->pvt = &_vtIApplet; .... } private: IAppletVtbl _vtIApplet; };
こうすれば、IAppletVtbl を初期化し、pvt にそのポインタを渡すことが出来るようになる。
これで仮想テーブルの初期化は終わりだ。次は AEEApplet_AddRef(), AEEApplet_Release() の処理について考えてみる。