我对C++还是很陌生,但是已经使用C#多年了,但是在这里对我没有帮助! :)

我的问题:我有一个Actor类,BallPeg都源自我正在开发的Objective-C iPhone游戏。在测试碰撞时,我希望根据BallPeg的实际运行时类型适当地设置actorAactorB的实例。我的代码对此进行了如下测试:

// 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];
        }

设置ballpeg后,我将继续运行hitByBall方法( objective-c )。

我真正的问题所在在于转换过程BallactorA进行转换;第一个if (static_cast<>)语句进入并适当设置ball指针。

第二步是将适当的类型分配给peg。我知道peg应该是Peg类型,我以前知道它将是actorB,但是在运行时检测到这些类型,我很惊讶地发现实际上第三个if (static_cast<>)语句已介入并进行了设置,该if语句是要检查actorA是否为一个Peg,我们已经知道actorABall!为什么它会踩到这里而不是第四个if语句?

我唯一可以假设的是强制转换与C#的工作方式不同,它发现实际上类型为actorABall是从Actor派生的,然后在执行static_cast<Peg*> (actorA)时发现它又是Peg也是从Actor派生的,因此这是有效的测试?这全都可以归结为我误解了static_cast的使用。我怎样才能达到我所需要的? :)

我真的很不舒服,感觉像是在这里用大量可笑的if语句进行了漫长的蛮横尝试。我敢肯定,有一种更优雅的方法来实现简单转换为Peg和转换为Ball,具体取决于actorAactorB中保存的实际类型。

希望有人可以帮助您! :)
非常感谢。

最佳答案

由于这是Objective-C代码(按照标题,不是C++),所以为什么不直接调用:

[actorA hitByBall];
[actorB hitByBall];

更新:如果将消息发送到的对象是nil,它将被忽略。如果将消息发送到的对象未实现hitByBall,则将获得异常“选择器无法识别”,除非您在基类中放置了空定义(Actor)。

然后,您可以删除ballpeg声明以及所有static_cast(即使在C++中也是不正确的)。

关于c++ - 在C++中强制转换为派生类型问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2886922/

10-12 23:22