クラスを導出するための「テンプレート」として使用される抽象クラスを作成しようとしています。抽象クラス自体からメンバー関数を呼び出すことはできないため、上記の抽象クラスへのポインターを格納するベクトル(スタック)を作成しました(ありがたいことに;))
しかし、クラスをコンパイルすると、次のエラーが発生します。
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();
}
}
事前にどうもありがとうございました。そして、前方宣言が問題である場合。2つのクラスがお互いを知っている必要があるそのような問題が、解決のための異なるアプローチで説明されている記事や本をおそらく知っていますか?すでにたくさんの本を検索しましたが、なかなか見つかりませんでした。
あなたはインクルードする必要がありGameState.hpp
にGame.cpp
そうGameState
その時点で完了します。前方宣言では宣言std::stack<GameState*>
が可能ですが、クラスメソッドを呼び出すための定義が利用可能である必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加