2011-09-10 13 views
-1

は、私はこれらの2つのクラスを持っていると言いますbクラスのメソッドとその逆?循環依存関係は、

+3

のStackOverflowの幽霊が語る、 "* Uhhhhhhnnnn ... Neeeeed moooore cooooode ...... *" –

+2

が、私はそこにすべてのクラスが表示されていないので、私はdownvotingよ。 –

答えて

2

あなたはこのように、宣言を前方に使用することができます。詳細については、this SOの質問を参照

class B; 

class A 
{ 
    B* ThisIsValid; 
} 

class B 
{ 
    A SoIsThis; 
} 

プリプロセッサ#includeには、コードを整理するためのより良い方法があります。完全なストーリーがなければ、言うことは難しいです。

+1

シンプルなモデルがヘッダーファイルで前方を宣言していた場所を見てきました。 – Joshua

0

「フォワード宣言」と呼ばれるものを使用することができます。

関数の場合、これはvoid myFunction(int);のようになります。変数の場合は、extern int myVariable;のようになります。クラスの場合、class MyClass;。これらのボディーステートメントは実際のコードを含む宣言の前に含めることができ、宣言された型を使用してコードを生成するのに十分な情報をコンパイラーに提供することができます。

円形インクルードの問題を回避するには、各ヘッダーファイルの先頭に「包含ガード」(#ifdef)を入れて、2回インクルードできないようにします。

+0

この答えは、事実の中核を議論するものではありません。これは、 'A'のヘッダーに' B'の言葉を制限して宣言可能なものを前進させるのですが、 'A'のソースファイルでは自由です'#include'は完全な定義を含みません。何もソースファイルを' #include'するつもりはないからです。あなたはそれに循環的な依存関係を持たないでしょう。これはヘッダーにのみ影響します。これは、型の使用を効果的に無効にするアプローチを利用する方法です。 –

0

"other"クラスは、 "first"クラスへの参照またはポインタしか持てません。ファイルBHで

#include "b.h" 

struct a { 
    b m_b; 
}; 

:ファイルああで

ファイルb.cppで

struct a; 

struct b { 
    a* m_a; 
}; 

void using_the_a_instance(b& theb); 

#include "b.h" 
#include "a.h" 

void using_the_a_instance(b& theb) 
{ 
    theb.m_a = new a(); 
} 
1

@Borealidの答えに拡張するには:

円形インクルードの問題を避けるには、「インクルードガード」を使用してください。

例:

#ifndef MYFILE_H /* If this is not defined yet, it must be the first time 
we include this file */ 
#define MYFILE_H // Mark this file as already included 
// This only works if the symbol we are defining is unique. 

// code goes here 

#endif 
関連する問題