C ++:メンバー関数を呼び出すときのポインターベクトル内の抽象クラスの無効な使用

トッベウィドナー

クラスを導出するための「テンプレート」として使用される抽象クラスを作成しようとしています。抽象クラス自体からメンバー関数を呼び出すことはできないため、上記の抽象クラスへのポインターを格納するベクトル(スタック)を作成しました(ありがたいことに;))

しかし、クラスをコンパイルすると、次のエラーが発生します。

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つのクラスがお互いを知っている必要があるそのような問題が、解決のための異なるアプローチで説明されている記事や本をおそらく知っていますか?すでにたくさんの本を検索しましたが、なかなか見つかりませんでした。

user7860670

あなたはインクルードする必要がありGameState.hppGame.cppそうGameStateその時点で完了します。前方宣言では宣言std::stack<GameState*>が可能ですが、クラスメソッドを呼び出すための定義が利用可能である必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

どのクラスかを知らずにC ++メンバー関数ポインタを呼び出す

分類Dev

C ++ TaskSchedulerの関数ポインターとしてクラス内のメソッドを呼び出す方法-Arduino

分類Dev

C ++で基本クラスへのポインターが与えられたときに、派生クラスオブジェクトのオーバーロードされた関数が呼び出されないのはなぜですか?

分類Dev

別のクラスのメンバー関数を呼び出すc ++

分類Dev

削除されたコンストラクターへのC ++呼び出し。ポインターベクトルとforループを理解する

分類Dev

関数呼び出しとポストインクリメントを含む式内のCシーケンスポイント

分類Dev

クラスメンバーとしてのC ++ベクトルと関数内

分類Dev

Cで関数ポインタを呼び出すときのコンパイルエラー

分類Dev

C ++関数ポインターを期待する暗黙のコンストラクター呼び出しにラムダを使用

分類Dev

Moq&C#:コールバックが無効です。パラメータを使用したメソッドのセットアップでは、パラメータを使用してコールバックを呼び出すことはできません

分類Dev

他のコンストラクターの呼び出し内でコンストラクターを呼び出すときのC ++コンパイルエラー

分類Dev

C ++ 17の別のコンストラクターとは異なる引数タイプでコンストラクターを呼び出す

分類Dev

抽象クラスポインタベクトルのサブクラスのメンバーにアクセスするC ++

分類Dev

名前でメンバー関数を呼び出すことができるc ++クラスの関数を提供する方法

分類Dev

c#ライブラリを呼び出すときのX ++「無効なトークン」メッセージ(メソッドを正しく呼び出す方法)

分類Dev

C ++ポインタを使用してオブジェクト内のメソッドを呼び出してメンバー値を変更する

分類Dev

構造タイプパラメーターを使用してc ++ dllのエクスポートされた関数を呼び出すPowerShell

分類Dev

C ++でポストインクリメント演算子をオーバーロードすると、コンストラクターが2回呼び出されるのはなぜですか?

分類Dev

クラス定義C ++の前にクラスメンバー関数ポインタを使用する

分類Dev

C ++:同じクラスのメンバー関数から純粋仮想関数を呼び出す

分類Dev

C ++テンプレート:基本クラスから派生テンプレートクラスのメンバー関数を呼び出す

分類Dev

c#関数、クラス、構造体、またはインターフェイスメンバー宣言の無効なトークン 'bool'

分類Dev

クラスメンバーへのC ++関数ポインタ

分類Dev

C#でそのメンバー関数にアクセスしながら、1つのクラスのコンストラクターを呼び出さないようにするにはどうすればよいですか?

分類Dev

C ++の独自の定義からクラスメンバー関数を再帰的に呼び出す方法は?

分類Dev

C# の別のクラスからメイン フォームの関数を呼び出す

分類Dev

サブクラスがベースクラスコンストラクターを呼び出し、サブクラスArduino C ++でベースクラスのインスタンスメソッドを使用する

分類Dev

クラスインスタンスを初期化するときに、C ++がクラスメンバーのコンストラクターを暗黙的に呼び出す

分類Dev

C ++ Structとその継承メンバーのデフォルトコンストラクターを呼び出す

Related 関連記事

  1. 1

    どのクラスかを知らずにC ++メンバー関数ポインタを呼び出す

  2. 2

    C ++ TaskSchedulerの関数ポインターとしてクラス内のメソッドを呼び出す方法-Arduino

  3. 3

    C ++で基本クラスへのポインターが与えられたときに、派生クラスオブジェクトのオーバーロードされた関数が呼び出されないのはなぜですか?

  4. 4

    別のクラスのメンバー関数を呼び出すc ++

  5. 5

    削除されたコンストラクターへのC ++呼び出し。ポインターベクトルとforループを理解する

  6. 6

    関数呼び出しとポストインクリメントを含む式内のCシーケンスポイント

  7. 7

    クラスメンバーとしてのC ++ベクトルと関数内

  8. 8

    Cで関数ポインタを呼び出すときのコンパイルエラー

  9. 9

    C ++関数ポインターを期待する暗黙のコンストラクター呼び出しにラムダを使用

  10. 10

    Moq&C#:コールバックが無効です。パラメータを使用したメソッドのセットアップでは、パラメータを使用してコールバックを呼び出すことはできません

  11. 11

    他のコンストラクターの呼び出し内でコンストラクターを呼び出すときのC ++コンパイルエラー

  12. 12

    C ++ 17の別のコンストラクターとは異なる引数タイプでコンストラクターを呼び出す

  13. 13

    抽象クラスポインタベクトルのサブクラスのメンバーにアクセスするC ++

  14. 14

    名前でメンバー関数を呼び出すことができるc ++クラスの関数を提供する方法

  15. 15

    c#ライブラリを呼び出すときのX ++「無効なトークン」メッセージ(メソッドを正しく呼び出す方法)

  16. 16

    C ++ポインタを使用してオブジェクト内のメソッドを呼び出してメンバー値を変更する

  17. 17

    構造タイプパラメーターを使用してc ++ dllのエクスポートされた関数を呼び出すPowerShell

  18. 18

    C ++でポストインクリメント演算子をオーバーロードすると、コンストラクターが2回呼び出されるのはなぜですか?

  19. 19

    クラス定義C ++の前にクラスメンバー関数ポインタを使用する

  20. 20

    C ++:同じクラスのメンバー関数から純粋仮想関数を呼び出す

  21. 21

    C ++テンプレート:基本クラスから派生テンプレートクラスのメンバー関数を呼び出す

  22. 22

    c#関数、クラス、構造体、またはインターフェイスメンバー宣言の無効なトークン 'bool'

  23. 23

    クラスメンバーへのC ++関数ポインタ

  24. 24

    C#でそのメンバー関数にアクセスしながら、1つのクラスのコンストラクターを呼び出さないようにするにはどうすればよいですか?

  25. 25

    C ++の独自の定義からクラスメンバー関数を再帰的に呼び出す方法は?

  26. 26

    C# の別のクラスからメイン フォームの関数を呼び出す

  27. 27

    サブクラスがベースクラスコンストラクターを呼び出し、サブクラスArduino C ++でベースクラスのインスタンスメソッドを使用する

  28. 28

    クラスインスタンスを初期化するときに、C ++がクラスメンバーのコンストラクターを暗黙的に呼び出す

  29. 29

    C ++ Structとその継承メンバーのデフォルトコンストラクターを呼び出す

ホットタグ

アーカイブ