我无法通过函数访问子类的成员,我该怎么做?

时间:2015-08-12 02:11:41

标签: c++ class pointers inheritance

好吧,所以对于像我这样的C ++相对论新人来说,我的处境非常复杂。我正在创建一个游戏(AGK库),我有一个框架类,它是所有游戏对象的基类,具有frameEvent之类的标准函数,这些函数将被覆盖由子对象。

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

为了在处理游戏时让生活更轻松,作为游戏一部分的每个对象只是Framework *类型向量中的指针。框架是基类。我被告知,只要它们也是一个指针,它就可以让我拥有不同类型的子对象。到目前为止,它已经解决了。

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

  1. frameEvent
  2. frameEndEvent - 无法覆盖
  3. drawEvent
  4. 他们真的只是功能。所以在敌人的子弹类中,我需要检查它是否与oPlayer发生碰撞,所以我在全局类中有一个函数(全局类在它们的frame事件中被传递给对象,所以他们可以与其他对象进行通信。)抓住给定的对象。

    搜索所有对象以查找参数对象 - 因此,如果我通过new oPlayer,它将返回游戏中的真实oPlayer指针。

    当子弹与玩家发生碰撞时,它需要降低玩家的生命值,然后自行消灭。因此,在子弹的创建函数中,它创建一个虚拟播放器,然后使用全局类函数定位真实播放器。代码是

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

    该代码有效,但需要playerChecker才能成为Framework *类型,因为classToObject返回的是{。}}。但是当我后来使用那个指针时,我无法访问玩家的成员,即使这是玩家的指针。     playerChecker-> hitPoints--; hitPoints仅限于oPlayer。我认为它被称为对象拼接或切片,但我认为这是使用指针修复的原因。

    所以我尝试将playerChecker类型设为oPlayer *,但它表示Framework *无法转换为它。所以我不知道该怎么做。

    非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

你得到的错误是什么?请发布此信息,因为我们无法提供更多帮助。

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

答案 1 :(得分:0)

来自Framework*的{​​{1}}可以使用classToObject向下转发为oPlayer*,如下所示:

dynamic_cast

oPlayer* playerChecker = dynamic_cast<oPlayer*>(ObjGlobal->classToObject(tempPlayer)); if (oPlayer) { // cast succeeded, do stuff with the pointer } 是一个C ++类型的转换操作符,就像C风格的转换一样,具有一些特殊属性。它专门用于在指针或对多态对象的引用之间进行转换(例如dynamic_cast,可以将其视为oPlayerFramework。它还添加了一个运行时检查,用于验证您尝试转发的对象确实是您尝试转换为的类的实例。如果它不是,它将返回一个空指针,或者在引用的情况下,抛出异常。

您的代码也可以使用C风格的转换或oPlayer(这类似于带有编译类型检查的C风格转换)。

static_cast

由于缺少运行时检查,这些开销较少,但这也意味着它们不安全,除非您可以保证您指向的指针指向正确类型的对象。此外,由于static_cast<oPlayer*>(ObjGlobal->classToObject(tempPlayer)) // static_cast (oPlayer*)ObjGlobal->classToObject(tempPlayer) // C-style cast 具有非常特殊的用途,因此可以明确您的意图。