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 方法。