2017-12-02 21 views
0

私は現在、小さなアプリケーションクラスを開発中です。 SDL2を痛みの少ないものにするためのあるステップを踏み出すことになっています。私は、派生クラス(アプリケーションクラスはベースインターフェイス)を実装するときに、現在のSDL_Eventを自動的に渡すためにhandleEventという関数をオーバーロードして、ユーザーがそれを処理できるようにしたいと考えています。SDLがイベントコールバックとして純粋仮想メンバー関数を呼び出すようにするには?

SDL関数SDL_AddEventWatchを使用してコールバックを作成すると、スレッドを起動して新しいイベントを手動でチェックしてメンバー関数を呼び出すよりも優れていると考えました。

ただし、SDL Documentation for the functionでは、メンバー関数を「フィルタ」として使用していません。私は純粋な仮想メンバ関数を使用しています!

私の見解からすれば、この関数が必要とする唯一のパラメータは、処理対象の偶数へのポインタです。しかし、このポインタは依然としてアクセスされなければならないので、ユーザは単にクラス内のものを直接変更することができます。

これを実装する適切な方法は何ですか?

+2

コードはどこですか? – Phil1970

+0

コードなしの問題は表示されません。コールバックオブジェクトを繰り返し処理し、必要なものを呼び出し、それをSDLイベントコールバックとして設定する関数を記述します。イベントキューはそれ自身を設定せず、 'SDL_PumpEvents'を呼び出す必要があることに注意してください。 – keltar

答えて

1

libffiのクロージャを使用して、予想される署名と一致するインスタンスの周りにラッパーを作成します。クロージャを初期化するために使用される関数は、保存されたインスタンスパラメータとSDLが渡したものを仮想関数に転送します。

+0

私は特定のケースでは非常に具体的な解決策が簡単だったので、私はこの答えを使用しなかったが、私はこれを試して、それも同様に動作します。 – MoustacheSpy

関連する問題