13
#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 ++構文ですか?

編集: gamestate のタイプミスについて申し訳ありません。State に変更しましたが、それでもエラーが発生します。

4

2 に答える 2

23

では、実際に定義する前に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();
}
于 2013-08-17T02:59:19.017 に答える
4

名前だけが必要な場合、たとえば、ポインタ、参照、関数値の引数、または戻り値の型を形成するために、型を前方宣言できます。関数定義やポインターの逆参照などで実質的に使用する場合は、その定義が必要です。についての問題に対処する方法は、メンバー関数を宣言することですが、 のクラス定義で定義することではありませんStateCore代わりに、 の定義が見られたら、それを定義します。

State::State(Core* core){
    core->setState();
}
于 2013-08-17T03:01:35.880 に答える