【问题标题】:I can't access members of a child class through functions, how do I?我无法通过函数访问子类的成员,我该怎么办?
【发布时间】:2015-08-12 02:11:40
【问题描述】:

好的,所以对于像我这样的 C++ 相对论新手来说,我的情况真的很复杂。我正在制作一个游戏(AGK 库),并且我有一个框架类,它是所有游戏对象的基类,具有 frameEvent 等标准函数,这些函数将被子对象覆盖。

这一切都很好,花花公子,我已经通过开发获得了大约 70%,但我遇到了一个至关重要的问题。

为了在处理游戏时更轻松,作为游戏一部分的每个对象都只是 Framework* 类型向量中的一个指针。框架是基类。有人告诉我,将其设为指针允许我拥有不同类型的子对象,只要它们也是指针即可。到目前为止,它已经解决了。

每一帧,全局对象都遍历所有对象的向量,并运行它们的

  1. frameEvent
  2. frameEndEvent -- 不能被覆盖
  3. drawEvent

它们实际上只是函数。所以在敌人的子弹类中,我需要检查它是否与oPlayer发生碰撞,所以我在全局类中有一个函数(全局类在它们的帧事件中传递给对象,以便它们可以与其他对象进行通信。)抓取给定的对象。

它搜索所有对象以找到参数对象——所以如果我传递new oPlayer,它将在游戏中返回真正的oPlayer指针。

当子弹与玩家相撞时,它需要降低玩家的生命值,然后将自己摧毁。因此,在子弹的创建函数中,它创建了一个虚拟玩家,然后使用全局类函数定位真正的玩家。代码是

//Find the player
oPlayer* tempPlayer = new oPlayer;
playerChecker = ObjGlobal->classToObject(tempPlayer);
tempPlayer->objectDestroy();

该代码有效,但它需要 playerChecker 为 Framework* 类型,因为这是 classToObject 返回的内容。但是当我稍后使用该指针时,即使那是玩家的指针,我也无法访问玩家的成员。 playerChecker->hitPoints--; hitPointsoPlayer 独有的。我认为它被称为对象拼接或切片,但我认为这就是使用指针固定的。

所以我尝试让playerChecker 输入oPlayer*,但它说Framework* 无法转换为它。所以我不知道该怎么办。

非常感谢任何帮助。

【问题讨论】:

  • 您应该尝试制作一个小示例程序来展示这个问题。关于您的代码,我们不得不猜测太多细节。
  • 我可能完全误解了发生了什么,但是如果玩家与子弹碰撞而不是子弹与玩家碰撞,您是否能够调用函数,在这种情况下,您似乎可以在那里调整玩家的生命值。
  • 这听起来很像虚拟成员函数会非常有用。可能无法完全解决您的问题,但由于您没有提到您的任何成员函数都是虚拟的,也许您没有使用它们?

标签: c++ class pointers inheritance


【解决方案1】:

您的Framework* 来自classToObject 可以使用dynamic_cast 向下转换为oPlayer*,如下所示:

oPlayer* playerChecker = dynamic_cast<oPlayer*>(ObjGlobal->classToObject(tempPlayer));
if (oPlayer) {
    // cast succeeded, do stuff with the pointer
}

dynamic_cast 是一个 C++ 类型转换运算符,就像 C 样式转换一样,具有一些特殊属性。它专门设计用于在多态对象的指针或引用之间进行转换(例如您的oPlayer,可以同时视为FrameworkoPlayer)。它还添加了一个运行时检查,以验证您尝试向下转换的对象确实是您尝试转换到的类的实例。如果不是,它将返回一个空指针,或者在引用的情况下,抛出一个异常。

您的代码也可以使用 C 样式转换或 static_cast(这很像带有编译类型检查的 C 样式转换)。

static_cast<oPlayer*>(ObjGlobal->classToObject(tempPlayer)) // static_cast
(oPlayer*)ObjGlobal->classToObject(tempPlayer) // C-style cast

由于缺少运行时检查,它们的开销较小,但这也意味着它们是不安全的,除非您可以保证要转换的指针指向正确类型的对象。另外,由于dynamic_cast 有一个非常具体的用途,它可以清楚地表明您的意图是什么。

【讨论】:

  • 它解决了问题,谢谢!但我不知道发生了什么......你介意解释一下 dynamic_cast 是什么吗?再次感谢
【解决方案2】:

您遇到了什么错误?请发布此内容,否则我们无法提供太多帮助。

如果我不得不猜测,您忘记将public: 添加到您的class FrameWork。这个,或者你的类中没有设置器/获取器。

【讨论】:

    猜你喜欢
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多