c++ - C++ 中的派生类型转换问题

标签 c++ objective-c casting box2d-iphone

我是 C++ 的新手,但已经使用 C# 多年,但它对我没有帮助! :)

我的问题:我有一个 ActorBallPeg两者都源 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];
        }

一次ballpeg已设置,然后我继续运行 hitByBall方法( objective-c )。

我真正的问题在于类型转换程序 BallactorA 投出罚款;第一个if (static_cast<>)语句介入并设置 ball适当的指针。

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

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

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

相关文章:

C++ vector of priority_queue of strings with custom strings comparator

iphone - 一次仅选择一个按钮

iphone - 第一次单元格可见时未绘制 UIImageView 阴影

c - 如何在无符号操作数之间进行带符号比较?

c++ - (速度)优化影响代码的意外部分

C++解析可变长度的 double 行

c++ - 如何实现类模板的前向声明

iphone - 什么是网络线程?

c - cast 周围的指针算术

c# - 将 double 转换为 decimal 还是从 double 构造 "new"decimal 更好?