2

私はC++を初めて使用しますが、C#を何年も使用していますが、ここでは役に立ちません。:)

私の問題:私は、私が取り組んでいるObjective-CのiPhoneゲームから派生したActorクラスを持っています。衝突をテストしているので、またはの実際の実行時タイプに応じて、のインスタンスを適切に設定したいと思います。これを次のようにテストする私のコード:BallPegBallPegactorAactorB

// 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)PegActorstatic_cast

ifとんでもない発言がたくさんある、ここでの長々とした野蛮なキャスティングの試みのように私が感じることについて、私は本当に不安です。とに保持されている実際のタイプに応じて、単純なキャストPegとキャストを実現するためのよりエレガントな方法があると確信しています。BallactorAactorB

誰かが助けてくれることを願っています!:) どうもありがとう。

4

3 に答える 3

3

これは Objective-C コード (タイトルのとおり、C++ ではありません) であるため、次のように呼び出してみませんか。

[actorA hitByBall];
[actorB hitByBall];

更新:メッセージの送信先オブジェクトが である場合、メッセージはnil無視されます。メッセージの送信先のオブジェクトが を実装していないhitByBall場合、基本クラス ( ) に空の定義を入れていない限り、「セレクターが認識されません」という例外が発生しますActor

ballその後、 andpeg宣言とすべてのsを削除できますstatic_cast(これは C++ でも正しくありません)。

于 2010-05-22T05:46:03.087 に答える
2

実行時にオブジェクト タイプを識別するには、そうすべきであり、すべきではdynamic_castありませんstatic_cast。しかし、あなたは本当にあなたのデザインを再考する必要があります. おそらく(私はobjective-cについては何もしません)hitByBall、基本クラスで仮想メソッドを作成し、派生クラスで必要な場合は実装をオーバーライドする必要があります。その後、キャストなしでメソッドを呼び出すことができます。

于 2010-05-22T04:16:33.863 に答える
1

をお探しのようです-isKindOfClass。両方のオブジェクトが NSObject プロトコルに準拠している場合は、どちらがどのタイプであるかを確認するだけで済みます。実際のメッセージの受け渡しは、ポインターの静的タイプによって制限されません。

if (   [actorA isKindOfClass:[Peg class ]] 
    && [actorB isKindOfClass:[Ball class]]) 
{
    [actorA hitByBall];
}
else if (   [actorB isKindOfClass:[Peg class ]]
         && [actorA isKindOfClass:[Ball class]]) 
{
    [actorB hitByBall];
}
于 2010-05-22T06:07:52.080 に答える