1

私は現在、私のプロジェクト(C ++)に相互に含めることに問題があります。

通常、相互包含の問題が発生した場合は、前方宣言を行うか、クラスを少し再設計することで簡単に解決できます。しかし、今回は行き詰まりました:

Gameというクラスがあり、コア ゲーム システムを作成して起動します。これらの 1 つはGraphicsSystemと呼ばれます。Game コンストラクターでは、GraphicsSystem オブジェクトが動的に作成され、GraphicsSystem* ポインターに格納されます。次のようになります。

Game::Game ()
{
    gfxSys = new GraphicsSystem(80, new Camera());
}

ここで、GraphicsSystem クラスは、ある時点で Game クラスのメソッドにアクセスして、Game オブジェクト内に格納されているプレーヤー オブジェクトを取得する必要があります。それぞれの部分は次のようになります (ゲームはシングルトンです!):

void GraphicsSystem::handleFrame ()
{
    ElementList elements = Game::instance()->getPlayer()->getEnvironment()->getElements();
}

今、私はすでに両方向で前方宣言を試みましたが、それはコンパイラを満足させません。もちろん、プレイヤー ポインターをグラフィック システムに配置することもできますが、彼はそこに属していないため、実際にはそうしたくありません。

デザインをあまり変更せずにこれを解決する方法はありますか? 私は今本当に困っているので、皆さんが私を助けてくれることを願っています.

Visual Studio 2010 (Visual C++) を使用しています。

前もって感謝します!クリス

4

3 に答える 3

1

C++で循環依存関係を解消する主な方法は2つあります。

1)実クラスによって実装され、実クラスが継承するメソッドをリストする「インターフェース」クラスを作成します。次に、実際のクラスの宣言の代わりにそれを含めることができます。

2)Pimpl-クラスは実際のデータへの不透明なポインターを保持し、メンバー変数のタイプの宣言を含める必要があるという問題を解決します。

于 2012-08-09T00:23:35.013 に答える
1

Game.h で GraphicsSystem を前方宣言します。必要に応じて、Game.h を GraphicsSystem.h に含めます。Game.cpp に Game.h と GraphicsSystem.h を含めます。GraphicsSystem.cpp に Game.h と GraphicsSystem.h を含めます。これは、投稿したコードに基づいて機能するはずです。

于 2012-08-09T00:25:45.167 に答える
0

これは危険に聞こえるかもしれませんがglobal reference、初期化されたGameクラスに a を保持することを検討しましたか?

私はグローバルが邪悪であることなどを知っており、多くの人が激怒するだろうと確信していますが、私の個人的な経験では、クラスで(とりわけ)シングルトン炎に屈しGame、時にはそれが単にそうではないことを発見しました必要ない。

自問する必要がある最大の質問は、「誰からゲーム オブジェクトを保護しようとしているのか?そして、ゲーム クラスが必要になるたびにインスタンスを要求する必要がある理由があるのか​​? 私は、あなたのGameオブジェクトがとにかく、エンジンで他に多くのことを行うことはありません。

あなたの質問に直接答えているわけではありませんが、これが物事を別の方法で考えるのに役立つことを願っています.

于 2012-08-09T00:25:36.103 に答える