2011-07-04 13 views
1

ここは私の問題です。デザインの問題に関するヘルプ

私はBox2Dという物理ライブラリを使用しています。私は、2つの器具が衝突したときに私に教えるリスナーを接続することができます。

基本的にBox2Dの仕組みは、b2Bodiesを作成することです。したがって、私は、どのb2Bodyが衝突したフィクスチャに属するのか知るだけです。私の試合ではエンティティがあり、そこからPhisicsEntityがあります。 PhysicsEntityはb2Bodyへのポインタを保持します。また、Entityから送信されるsendMessageメソッドもあります。問題は、b2Bodyから、PhysicsEntityに衝突メッセージを送信する方法です。私がやったと思ったのは、b2BodyのuserData void *を対応するPhysicsEntityに設定することでした。これを行うには、void *をキャストしなければならないのは非常に間違っているようです。

キャストやルックアップなしでb2Bodyに関連付けられている物理エンティティをすばやく知る方法がありますか?

ありがとうございました

答えて

0

これはuserDataフィールドのようなフィールドが、ライブラリのオブジェクトに関連するアプリケーションのデータを参照するためのものです。これは、void *の完全に適切な使用です。

void *からの変換はキャストなしでも実行できるためキャストを使用する必要はないと言いますが、キャストを使用する必要がある可能性がありますしかし、私が正しくリコールすれば、C++はそれらのキャストを必要とします(私はC++を使用していません)。

+0

C++では、void *との間でキャストが必要です。部分的には、void *を「何かへのポインタ」として使う人やあるタイプから別のタイプへの安価なキャストとして、複数の継承を考慮して破損を招くのに役立ちます。 – dascandy

0

これは実際にuserDataポインタの意味です。それはかなり標準的なパラダイムです - 別の例のpthread_createやCreateThreadなどの関数を見てください。

void *を使用できないライブラリ(または安全でない - たとえばintとしてローカルに格納するなど)を見つけた場合は、std :: mapを使用して型を解決できます。それはより遅く、はるかにオーバーヘッドとなります。

+0

クラスは多態性であるため、動的キャストする必要がありますか? – jmasterx

+0

いいえ、static_castまたはc-styleのケースを使用することができます(ただし、前者を好む)。あなたはここでのみ同じポインタ型にキャストしようとしていますので、どちらの方法でもうまくいくでしょう。 Reinterpret_castも機能しますが、これは必要ではなく、これは(少なくともそれほどではありませんが)醜い何かを示すものになります。 – dascandy

関連する問題