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