Eclipse CDT中的循环依赖

时间:2015-12-05 14:40:17

标签: c++ eclipse

我知道这件事并没有得到足够的重视,因为它不经常见到,但我想澄清一下。

说我有3个文件:

A.H

#ifndef A_h
#define A_h
#include "B.h"
class A {
    A();
    virtual ~A();
    bool someFunc(B& b);
};
#endif

B.h

#ifndef B_h
#define B_h
#include "A.h"
class B {
    B();
    virtual ~B();
    bool someFunc(A& a);
};
#endif

和main.cpp

#include "A.h"
#include "B.h"
int main() { return 0; }

没有保护(#ifndef X_h #define X_h)存在循环依赖。添加保护应该可以解决问题但是在编译代码时,首先main.cpp尝试包含a.h,它在声明之前尝试包含b.h并返回错误。如果我们将代码更改为:

A.H

#ifndef A_h
#define A_h
class A {
    A();
    virtual ~A();
#include "B.h"
    bool someFunc(B& b);
};
#endif

B.h

#ifndef B_h
#define B_h
class B {
    B();
    virtual ~B();
#include "A.h"
    bool someFunc(A& a);
};
#endif

现在Cyclic依赖关系已经解决,但是代码编译时没有错误但是Eclipse仍然返回错误:“类型'B'无法解析”,所以你需要在Ah和Bh中添加surpress,而另一个用来。我想知道是否有另一种解决循环依赖的方法,如果没有Eclipse返回错误,如果我们有两个以上的类,代码应该怎么样(A包括B,C和D; B包括A,C,D .. 。)

1 个答案:

答案 0 :(得分:2)

只要您实际上不在类B中使用类A实例,反过来,并且只声明使用指针或引用的函数,你可以在不包括任何内容的情况下离开,只有声明这些类:

在文件A.h

#ifndef A_h
#define A_h

class B;  // Declare class B

class A {
    A();
    virtual ~A();
    bool someFunc(B& b);
};
#endif

和B.h

#ifndef B_h
#define B_h

class A;  //Declare class A

class B {
    B();
    virtual ~B();
    bool someFunc(A& a);
};
#endif

在定义(实现)功能的源文件中,您当然需要包含这两个文件。