编辑:修改了带有保护的头文件。我忘了把这些放在这个例子中。虽然我的项目中已经有了这些。
我有这两个课。
档案啊:
#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
文件 b:
#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();
继续这一点,我有一个 B 类,它需要 A 类的对象才能工作,而 A 通过 getB() 提供了一个使用自身的 B 类型的对象,因为每个 A 必须只有一个 B 的实例,我虽然这没关系。自从我这样做以来,编译时间增加了几秒钟,而我的项目中只有一个非常少的类。
循环依赖编译需要这么长时间吗?如果是这样,编译具有大量循环依赖项的项目可能会非常耗时。