我对C++还是很陌生,但是已经使用C#多年了,但是在这里对我没有帮助! :)
我的问题:我有一个Actor
类,Ball
和Peg
都源自我正在开发的Objective-C iPhone游戏。在测试碰撞时,我希望根据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
方法( objective-c )。我真正的问题所在在于转换过程
Ball
从actorA
进行转换;第一个if (static_cast<>)
语句进入并适当设置ball
指针。第二步是将适当的类型分配给
peg
。我知道peg
应该是Peg
类型,我以前知道它将是actorB
,但是在运行时检测到这些类型,我很惊讶地发现实际上第三个if (static_cast<>)
语句已介入并进行了设置,该if语句是要检查actorA
是否为一个Peg
,我们已经知道actorA
是Ball
!为什么它会踩到这里而不是第四个if
语句?我唯一可以假设的是强制转换与C#的工作方式不同,它发现实际上类型为
actorA
的Ball
是从Actor
派生的,然后在执行static_cast<Peg*> (actorA)
时发现它又是Peg
也是从Actor
派生的,因此这是有效的测试?这全都可以归结为我误解了static_cast
的使用。我怎样才能达到我所需要的? :)我真的很不舒服,感觉像是在这里用大量可笑的
if
语句进行了漫长的蛮横尝试。我敢肯定,有一种更优雅的方法来实现简单转换为Peg
和转换为Ball
,具体取决于actorA
和actorB
中保存的实际类型。希望有人可以帮助您! :)
非常感谢。
最佳答案
由于这是Objective-C代码(按照标题,不是C++),所以为什么不直接调用:
[actorA hitByBall];
[actorB hitByBall];
更新:如果将消息发送到的对象是
nil
,它将被忽略。如果将消息发送到的对象未实现hitByBall
,则将获得异常“选择器无法识别”,除非您在基类中放置了空定义(Actor
)。然后,您可以删除
ball
和peg
声明以及所有static_cast
(即使在C++中也是不正确的)。关于c++ - 在C++中强制转换为派生类型问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2886922/