編集: ガード付きの変更されたヘッダー ファイル。この例ではそれらを入れるのを忘れています。私はすでにプロジェクトにそれらを持っていましたが。
私はこの2つのクラスを持っています。
ファイルああ:
#ifdef A_H
#define A_H
#include "b.h"
#include "x.h" //not related to problem, is just included
class B; //fwd declaration, needed to use getB() outside of A
class A
{
public:
A(X &x);
B &getB();
...
private:
X &x;
}
#endif
ファイル bh:
#ifdef B_H
#define B_H
#include "x.h"
class A; //fwd declaration
class B
{
public:
B(X &x, A &a);
void methodThatUsesA();
...
private:
X &x;
A &a;
}
#endif
ファイル a.cpp:
#include "a.h"
#include "b.h"
A::A(X &x):x(x){}
B& A::getB()
{
static B b(x, *this);
return b;
}
...
ファイル b.cpp:
#include "b.h"
#include "a.h"
B::B(X &x, A &a) : x(x), a(a){}
void B::methodThatRequiresA(){
//does its thing...
}
それらの外から、私はそれらを次のように使用します:
#include "x.h"
#include "a.h"
X x(...);
A a(x);
a.getB().methodThatRequiresA();
これを再開すると、クラス A のオブジェクトが機能することを必要とするクラス B があり、A は getB() を介してそれ自体を使用するタイプ B のオブジェクトを提供します。これは大丈夫でした。これを行ってからコンパイル時間は数秒増加しましたが、プロジェクトにはもう1つのクラスしかありません。
循環依存関係はコンパイルに時間がかかりますか? もしそうなら、このような多くの循環依存関係を持つプロジェクトをコンパイルするには、多くの時間がかかる可能性があります.