Incomplete pointer used in child class - Error: use of undefined type

Incomplete pointer used in child class - Error: use of undefined type

好的...我已经理解了这个关于循环依赖和前向声明的问题,但是我无法理解涉及继承和基于指针的变量的特定错误。

我将展示相关代码的片段:

玩家是从实体

派生的class

Entity.hpp

class Entity : public sf::Sprite{

private:

    int health;
    float speed;
    sf::Time spawntime;
    bool invincible;


protected:

    SceneGame *myScene; // let's keep it at null
                        // since setScene will take care of it

   public:

// more code....

void setScene(SceneGame *scene){myScene = scene;};
    SceneGame* getScene(){return myScene;};

};

player.cpp // 假设 player.h 是完整的

myScene 可供任何 classes 派生形式实体访问

void Player::shootPlayer(float dt){

    // we reduce time for shoot delay

    shootDelay -= dt;

    if (shootDelay < 0.0f) return;

    resetDelay();

    if (Input::instance()->pressKeybutton(sf::Keyboard::Space)){



        // I know I set SceneGame* myScene as protected back in Entity class.
        // However, because it is claimed to be undefined,
        // despite being forward-declared back in entity,
        // I'm getting the 'use of undefined type class' error C2027

        sf::Texture bulletTex;
        bulletTex = (myScene->game->texmgr.getRef("bulletPlayer"));


        Bullet* bullet_p = new Bullet(bulletTex,
            1, 10, false, false, 0.0f);

        bullet_p->setPosition(this->getGlobalBounds().width,
                              this->getGlobalBounds().height / 2);

    }
}

link 回答问题: Forward declaration & circular dependency

尽管您已经前向声明了 SceneGame class,但您 必须 在开始使用 [=20] 的任何方法之前包含完整定义=],否则,编译器如何知道SceneGame class 支持哪些方法?

我希望您在 Player.cpp 文件中需要 #include "SceneGame.h" 或类似内容。

您有 SceneGame 的前向声明,可能在 entity.hpp 中以 class SceneGame; 的形式。这足以将其用作指针。

player.cpp 中,您实际上使用了 class 并且您需要了解其详细信息(在 header 中不需要)。可能,您的 player.cpp 应该包含一个 SceneGame.hpp(或者您的 SceneGame class 实际定义的任何地方)

通过在 player.cpp 文件中包含的末尾添加 #include "SceneGame.hpp" 进行修复。