2009-06-15 14 views
14

私はC++を初めて使うので、この質問は基本的なものかもしれません:お互いを参照する2つのクラス

私はお互いを参照する必要がある2つのクラスがあります。それぞれはそれ自身のヘッダファイルにあり、#includeはもう一方のヘッダファイルです。私がコンパイルしようとすると、「ISO C++では、クラスの1つに「型なしのFoo」の宣言が禁止されています。逆のヘッダーが最初に解析されるように処理を切り替えると、他のクラスと同じエラーが発生します。

C++では、相互参照が必要な2つのクラスを持つことは可能ですか?

詳細については、「App」クラスと「Window」クラスがあります。アプリケーションはウィンドウを参照する必要があります。 WindowにはAppにコールバックするボタンがあるので、Appへの参照が必要です。 2つのクラスが互いに参照することができない場合、これを実装するより良い方法がありますか?

+2

可能であれば、相互依存関係は避けるべきです。アプリケーション内のボタンが呼び出す機能を別のコントローラのishオブジェクトに因数分解するのは意味がありますか? –

+0

私の小さなゲームでこの問題が頻繁に発生します。私はWorldオブジェクトを持っています。例えば、Worldオブジェクトを参照する必要があるGameオブジェクトが含まれています。衝突検出。それをリファクタリングする良い方法を見つけていない。 (そしてbtw、7年前の議論を起こして、私に何らかのバッジを与えなければならない) – Johan

答えて

27

ヘッダーファイルに前方宣言を使用すると、ヘッダーに実装の依存関係がない限り、循環依存関係を回避できます。 Window.hでは、この行を追加します。App.hで

class App; 

を、次の行を追加します。

class Window; 

は、クラス定義の前にこれらの行を追加します。

ソースファイルでは、実際のクラス定義のヘッダーを含めることができます。

クラス定義が他のクラスのメンバー(インラインなど)を参照している場合は、ソースファイルに移動する必要があります(インラインではなくなります)。

8

前方への宣言が道です。

クラスヘッダーでpointers \ referenceを使用している場合は、両方向のForward宣言が役に立ちます。

オブジェクトをクラスメンバーとして作成する場合は、ヘッダー自体を含める必要があります。コンパイラはサイズを知るためにクラス定義が必要なので、前方宣言は機能しません。

Refer C++ FAQ for solving such senario:

あなたはメンバーとしてのウィンドウを作成している場合は、アプリケーションでウィンドウのヘッダーが含まれますが、同時にウィンドウは、Appのヘッダーを含めるべきではありません。 Appへのポインタとその前方宣言の組み合わせを使用します。

関連する問題