C++ による BREW 開発(8)

で、仮想テーブルの説明が終わったところで、実際に仮想テーブルを初期化する処理について考えてみる。


例によって AEEApplet_New() のプログラムを持ってくる。

    // 1.領域の確保
    pMe = (AEEApplet*)MALLOC( nSize + sizeof( IAppletVtbl ) );
    
    // 2.仮想テーブルの初期化
    appFuncs = (IAppletVtbl*)((byte*)pMe + nSize);
    
    appFuncs->AddRef      = AEEApplet_AddRef;
    appFuncs->Release     = AEEApplet_Release;
    appFuncs->HandleEvent = AEEApplet_HandleEvent;
    
    INIT_VTBL( pMe , IApplet , *appFuncs );

まずは領域の確保をするわけだけれども、このときに、メイン構造体の大きさ+仮想テーブルの大きさ分のメモリを確保している。
そして、appFuncs にはメイン構造体の後ろ、つまり仮想テーブルへのポインタがセットされることになる。
で、その仮想テーブルに対してそれぞれの関数をセットして、最後に pMe->pvt に対して appFuncs をセットしているというわけだ。
こうすると、pMe->pvt->AddRef() は AEEApplet_AddRef() を呼び出すようになるだろうし、pMe->pvt->Release() は AEEApplet_Release() を呼び出すようになる。これによる利点は前回に説明した。


で、これを C++ で書くとどうなるか。