1

さらに別の質問、どうぞ!...とにかく、プライベートコンストラクターと静的関数を備えた2つのクラスがあり、そのクラスのインスタンスを返します。すべて問題ありませんでした。次のようにして、gameState オブジェクト ポインターを取得できた main.cpp ファイルがあります。

gameState *state = gameState::Instance();

しかし今、私は問題を抱えているようです。便宜上、gameState インスタンスと actionHandler インスタンスの両方が相互へのポインターのコピーを保持するようにしました。だから私はお互いのヘッダーファイルに含めようとしました:

gameState *state;

actionHandler *handler;

ただし、これは機能していないようです...「エラー C2143: 構文エラー: ';' がありません」が表示されます。これらの行の両方で「*」の前にエラーが発生します...そのクラスにプライベートコンストラクターがある場合、ヘッダーで特定のクラスの変数を定義できませんか? それとも別の問題ですか?または、インスタンスへのポインターが静的メンバーとして格納されているためでしょうか?

編集:みんなありがとう!ここ数日で得られる C++ の知識の量には驚くべきものがあります。

4

3 に答える 3

6

各クラスのヘッダー ファイルに反対のクラスの前方宣言を追加する必要があるようです。例えば:

class actionHandler;

class gameState
{
private:
    actionHandler *handler;

    ...
};

と:

class gameState;

class actionHandler
{
private:
    gameState *state;

    ...
};
于 2009-11-30T02:36:03.763 に答える
4

プライベートコンストラクターによるものではありません。

循環依存関係があるためです。したがって、クラス A をコンパイルしようとすると、コンパイル済みのクラス A が必要なクラス B をコンパイルする必要があります。

前方宣言を試してください。

gameState が定義されているヘッダー ファイル内

class actionHandler;
于 2009-11-30T02:35:42.747 に答える
2

この問題は、プライベート コンストラクターとは関係ありません。特定の翻訳単位 (.cpp ファイルおよび含まれるすべての .h ファイル) では、クラスが宣言されるまで、C++ コンパイラはクラスの識別子を認識しません。これは、互いに参照するメンバーが 2 つのクラスに含まれている場合に問題を引き起こします。解決策は「前方宣言」と呼ばれ、クラス名だけで本体はありません。あなたの場合、次のようになります。

== gameState.h ==

...
// Note no #include for "actionHandler.h" (but there would be in gameState.cpp)

class actionHandler;

class gameState
{
  actionHandler *handler;
  ...
};
...

== actionHandler.h ==

...
#include "gameState.h"

// No forward declaration needed.

class actionHandler
{
  gameState* state;
  ...
};
...
于 2009-11-30T02:41:03.330 に答える