1. ホーム
  2. c++

[解決済み】未定義の型を使用する【重複あり

2022-02-23 09:20:53

質問内容

#include <iostream>

class Core;
class State;

int main (){
        std::cin.get();
        return 0;
}

class State{
public:
    State(Core* core){
        core->setState();
    }
};

class Core{
public:
    Core(){
        State state(this);
    }
    void setState(){
        std::cout << "setting state" << std::endl;
    }
};

未定義の型を使用しています」というエラーが出ます。両方のクラスを前方に宣言すれば、問題が解決すると思ったのですが、解りません。これは、私が見逃している愚かなC++の構文だけですか?

EDIT: gamestateのtypoについて申し訳ありません。Stateに変更しましたが、まだエラーが出ます。

解決方法は?

State::State を使用しています。 Core を、実際に定義される前に使用することができます。 この例では、コンストラクタの実装をクラス定義の外に出すことで、簡単に修正することができます。

class State{
public:
    State(Core* core);
};

class Core{
   // This stays the same...
};

State::State(Core* core)
{
   core->setState();
}

実際には、これらの関数の実装を別の実装にする方がずっと一般的です( .cpp その場合、前方宣言はあなたの期待通りに機能します。

その場合

// State.h
class Core;

class State{
public:
    State(Core* core);
};

そして

// Core.h
#include "State.h"
#include <iostream> //This is probably a good reason to further separate
                    //Core.h into Core.h and Core.cpp

class Core{
public:
    Core(){
        State state(this);
    }

    void setState(){
        std::cout << "setting state" << std::endl;
    }
};

そして、実装ファイル。

// State.cpp
#include "State.h"
#include "Core.h"

State::State(Core* core)
{
   core->setState();
}