【问题标题】:C++: Invalid use of abstract class inside pointer vector when calling member functionsC ++:调用成员函数时在指针向量内无效使用抽象类
【发布时间】:2018-09-03 00:07:51
【问题描述】:

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

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

error: invalid use of incomplete type 'class GameState'
  this->_states.top()->Cleanup();
                     ^~

我已经尝试了很多东西,但我认为问题在于,我在 Game 类中有一个 GameState 类的前向声明,因为它们都必须相互了解。会不会是这个问题?

为了查看,这里是我的代码的sn-ps:

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

提前非常感谢您。如果前向声明是问题所在;您可能知道任何文章或书籍,其中使用不同的解决方案描述了这样的问题,两个类必须相互了解? 我已经在一堆书中搜索过,但我真的找不到一本,这引起了我的注意。

【问题讨论】:

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


    【解决方案1】:

    您需要将GameState.hpp 包含在Game.cpp 中,这样GameState 将在此时完成。前向声明允许声明std::stack&lt;GameState*&gt;,但是应该可以定义来调用类方法。

    【讨论】:

    • 我认为不可能在 B 类中包含 A 类,同时在 A 类中包含 B 类?
    • 包含声明与包含实现和包含整个类有很大不同
    • 嗯,好的。所以我不能同时在彼此中包含类声明,但可以在其他类实现定义中包含一个声明?抱歉,如果我要求太多,但我只是想把这件事做好:)
    • @TobbeWidner 在这种特殊情况下没有问题。将有GameState 的前向声明,然后是Game 正文,然后是GameState 正文,然后是实现。实际上,真正的循环包含也可以。
    • 我明白了。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 2015-07-28
    • 2015-03-02
    • 2013-01-26
    • 2014-10-03
    • 2011-05-24
    • 1970-01-01
    • 2021-06-06
    • 2012-12-16
    相关资源
    最近更新 更多