我对 C++ 很陌生,但已经使用 C# 多年,但它在这里对我没有帮助!:)
我的问题:我有一个Actor类,Ball它们Peg都来自我正在开发的objective-c iphone游戏。当我测试碰撞时,我希望根据or的实际运行时类型适当地设置Ball和的实例。我的测试代码如下:PegactorAactorB
// 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方法(目标 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具体取决于保存在actorAand中的实际类型actorB。
希望有人可以提供帮助!:) 非常感谢。