0

编辑:修改了带有保护的头文件。我忘了把这些放在这个例子中。虽然我的项目中已经有了这些。

我有这两个课。

档案啊:

#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 的实例,我虽然这没关系。自从我这样做以来,编译时间增加了几秒钟,而我的项目中只有一个非常少的类。

循环依赖编译需要这么长时间吗?如果是这样,编译具有大量循环依赖项的项目可能会非常耗时。

4

1 回答 1

1

编译大项目,特别是优化可能需要很长时间。但在你的情况下,罪魁祸首是你没有在你的头文件中使用警卫,编译器必须多次解析同一个头文件。所以解决方案可能是(对于文件啊):

#ifndef A_H_
#define A_H_
// 
//

#endif // A_H_

对此有不同的解决方案,例如来自 MS VS 等的 pragma once,但这是 IMO 最便携的方式。符号不必完全像这样,但必须是唯一的。

于 2013-02-23T16:45:36.970 回答