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"
进行修复。
好的...我已经理解了这个关于循环依赖和前向声明的问题,但是我无法理解涉及继承和基于指针的变量的特定错误。
我将展示相关代码的片段:
玩家是从实体
派生的classEntity.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"
进行修复。