C ++:调用成员函数时,在指针向量内使用抽象类无效

时间:2018-03-24 12:06:36

标签: c++ pointers stack std forward-declaration

我试图创建一个抽象类,用作"模板"用于派生类。 我创建了一个向量(堆栈),在其中我存储指向所述抽象类的指针,因为你不能从抽象类本身调用成员函数(谢天谢地;))

但是当我编译我的类时,我收到以下错误:

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();
    }
}

非常感谢您提前。如果前方声明是问题;你可能知道任何文章或书籍,其中两个类必须彼此了解的问题用不同的解决方法来描述吗? 我已经在一堆书中搜索了,但是我找不到一本能引起我注意的书。

1 个答案:

答案 0 :(得分:2)

您需要在GameState.hpp中加入Game.cpp,以便GameState在此时完成。前向声明允许声明std::stack<GameState*>,但是可以使用定义来调用类方法。