C++:调用成员函数时在指针向量中无效使用抽象 class
C++: Invalid use of abstract class inside pointer vector when calling member functions
我正在尝试创建一个抽象 class,它被用作 "template" 来派生 classes。
我创建了一个向量(堆栈),我在其中存储指向所述抽象 class 的指针,因为你不能从抽象 class 本身调用成员函数(谢天谢地 ;))
但是当我编译 classes 时,出现以下错误:
error: invalid use of incomplete type 'class GameState'
this->_states.top()->Cleanup();
^~
我已经尝试了很多东西,我认为问题在于,我在游戏 class 中有一个 GameState class 的前向声明,因为它们必须相互了解。这可能是问题所在吗?
为了便于查看,这里是我的代码片段:
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();
}
}
非常感谢您。如果前向声明是问题所在;你可能知道任何文章或书籍,其中描述了两个 classes 必须相互了解的问题,并用不同的解决方案进行了描述?
我已经翻了一堆书,但我真的找不到一本,引起了我的注意。
您需要将 GameState.hpp
包含到 Game.cpp
中,这样 GameState
将在那时完成。前向声明允许声明 std::stack<GameState*>
但是定义应该可用于调用 class 方法。
我正在尝试创建一个抽象 class,它被用作 "template" 来派生 classes。 我创建了一个向量(堆栈),我在其中存储指向所述抽象 class 的指针,因为你不能从抽象 class 本身调用成员函数(谢天谢地 ;))
但是当我编译 classes 时,出现以下错误:
error: invalid use of incomplete type 'class GameState'
this->_states.top()->Cleanup();
^~
我已经尝试了很多东西,我认为问题在于,我在游戏 class 中有一个 GameState class 的前向声明,因为它们必须相互了解。这可能是问题所在吗?
为了便于查看,这里是我的代码片段:
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();
}
}
非常感谢您。如果前向声明是问题所在;你可能知道任何文章或书籍,其中描述了两个 classes 必须相互了解的问题,并用不同的解决方案进行了描述? 我已经翻了一堆书,但我真的找不到一本,引起了我的注意。
您需要将 GameState.hpp
包含到 Game.cpp
中,这样 GameState
将在那时完成。前向声明允许声明 std::stack<GameState*>
但是定义应该可用于调用 class 方法。