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() の処理について考えてみる。