私はC++を初めて使用しますが、C#を何年も使用していますが、ここでは役に立ちません。:)
私の問題:私は、私が取り組んでいるObjective-CのiPhoneゲームから派生したActor
クラスを持っています。衝突をテストしているので、またはの実際の実行時タイプに応じて、のインスタンスを適切に設定したいと思います。これを次のようにテストする私のコード:Ball
Peg
Ball
Peg
actorA
actorB
// Actors that collided
Actor *actorA = (Actor*) bodyA->GetUserData();
Actor *actorB = (Actor*) bodyB->GetUserData();
Ball* ball;
Peg* peg;
if (static_cast<Ball*> (actorA)) { // true
ball = static_cast<Ball*> (actorA);
}
else if (static_cast<Ball*> (actorB)) {
ball = static_cast<Ball*> (actorB);
}
if (static_cast<Peg*> (actorA)) { // also true?!
peg = static_cast<Peg*> (actorA);
}
else if (static_cast<Peg*> (actorB)) {
peg = static_cast<Peg*> (actorB);
}
if (peg != NULL) {
[peg hitByBall];
}
ball
とが設定されたらpeg
、メソッドの実行に進みますhitByBall
(Objectivec)。
私の問題が本当にあるのは、キャスト手順にありBall
ますactorA
。最初のif (static_cast<>)
ステートメントがステップインし、ball
ポインターを適切に設定します。
2番目のステップは、適切なタイプをに割り当てることpeg
です。私は型でpeg
あるべきだとPeg
以前は知っていましたがactorB
、実行時に型を検出すると、実際に3番目のif (static_cast<>)
ステートメントがステップインされてこれを設定したことに驚きました。これは、ifステートメントがでactorA
あるかどうかを確認するためのものでしたPeg
。知っactorA
ているBall
!なぜそれは4番目のif
ステートメントではなくここに足を踏み入れたのでしょうか?
私が推測できる唯一のことは、キャストがc#とどのように異なるかということです。つまりactorA
、実際に型がBall
派生しているものを検出し、実行Actor
時に 派生していることが検出されたので、これは有効なテストですか?これはすべて、私がの使用をどのように誤解したかに帰着する可能性があります。どうすれば必要なことを達成できますか?:)static_cast<Peg*> (actorA)
Peg
Actor
static_cast
if
とんでもない発言がたくさんある、ここでの長々とした野蛮なキャスティングの試みのように私が感じることについて、私は本当に不安です。とに保持されている実際のタイプに応じて、単純なキャストPeg
とキャストを実現するためのよりエレガントな方法があると確信しています。Ball
actorA
actorB
誰かが助けてくれることを願っています!:) どうもありがとう。