我试图创建一个抽象类,用作"模板"用于派生类。 我创建了一个向量(堆栈),在其中我存储指向所述抽象类的指针,因为你不能从抽象类本身调用成员函数(谢天谢地;))
但是当我编译我的类时,我收到以下错误:
error: invalid use of incomplete type 'class GameState'
this->_states.top()->Cleanup();
^~
我已经尝试了很多东西,我认为问题是,我在Game类中有一个GameState类的前向声明,因为它们都必须相互了解。这可能是问题吗?
出于查看目的,以下是我的代码片段:
GameState.hpp :
#include "Game.hpp"
class GameState {
public:
Game *game;
virtual void Init()=0;
virtual void Cleanup()=0;
... (etc.)
protected:
GameState(){}
};
Game.hpp:
#include <stack>
#include <SFML/Graphics.hpp>
#include "TextureManager.hpp"
// I GUESS THAT THIS DECLARATION IS THE PROBLEM!
class GameState;
class Game {
public:
TextureManager *TextureMgr;
sf::RenderWindow Win;
Game();
~Game();
... (etc.)
bool IsRunning() { return this->running; }
bool Quit() { this->running = false; }
private:
std::stack<GameState*> _states;
bool running;
};
Game.cpp:(调用成员函数示例)
void Game::Cleanup() {
while (!this->_states.empty()) {
this->_states.top()->Cleanup();
this->_states.pop();
}
}
非常感谢您提前。如果前方声明是问题;你可能知道任何文章或书籍,其中两个类必须彼此了解的问题用不同的解决方法来描述吗? 我已经在一堆书中搜索了,但是我找不到一本能引起我注意的书。
答案 0 :(得分:2)
您需要在GameState.hpp
中加入Game.cpp
,以便GameState
在此时完成。前向声明允许声明std::stack<GameState*>
,但是可以使用定义来调用类方法。