我知道这件事并没有得到足够的重视,因为它不经常见到,但我想澄清一下。
说我有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 .. 。)
答案 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
在定义(实现)功能的源文件中,您当然需要包含这两个文件。