编辑:带有警卫的修改头文件。我忘记把这些放在这个例子中。虽然我的项目已经有了这些。
我有这两个分支。
文件a.h:
#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.h:
#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提供了一个B类的对象,它通过getB()使用它自己,因为每个A必须只有一个B的实例。 ,我虽然这没关系。通过编译时间增加了几秒钟,因为我这样做了,而且我的项目中只有一个类很少。
循环依赖关系需要很长时间才能编译吗?如果是这样,编译具有大量循环依赖关系的项目可能需要花费很多时间。
答案 0 :(得分:1)
编译大项目,特别是优化可能需要很长时间。但在您的情况下,罪魁祸首是您不在标头中使用保护,并且编译器必须多次解析相同的头文件。所以解决方案可能是(对于文件a.h):
#ifndef A_H_
#define A_H_
//
//
#endif // A_H_
有一些不同的解决方案,例如MS VS等的pragma,但这是IMO最便携的方式。符号不必完全像这样,但必须是唯一的。