我是 C++ 的新手,但已经使用 C# 多年,但它对我没有帮助! :)
我的问题:我有一个 Actor
类 Ball
和 Peg
两者都源 self 正在开发的 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/