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++ で書くとどうなるか。