在开发项目过程中,为了方便调用,经常会碰到两个对象相互拥有对方的调用的过程。
大家都知道c++生成可执行代码的过程包括,预处理,编译,优化,汇编,链接。
接下来纪录一下这样的类的声明
#ifndef A
#define A
#include "B.h"
class A {
B* b;
};
#endif
#ifndef B
#define B
#include "A.h"
class B {
A* a;
}
#endif
#include "A.h"
#include "B.h"
int main() {
A* a;
B* b;
}
编译器加在A.h文件,A.h文件被预编译为
#ifndef A
#define A
#ifndef B
#define B
#include "A.h" //此时宏A已经定义 头文件A.h不会再次被加在 此指令不会执行
class B {
A* a;
}
#endif
class A {
B* b;
};
#endif
这样我们就能看到 定义类B的时候,A的类型还没有加载,编译器不知道,所以你得告诉编译器A的类型,需要类型的提前编译
#ifndef A
#define A
#ifndef B
#define B
#include "A.h" //此时宏A已经定义 头文件A.h不会再次被加在 此指令不会执行
class A; //类型A的提前声明,意思是告诉编译器,你不用管了,这个类型存在,不会影响接下来的链接的。
class B {
A* a;
}
#endif
class A {
B* b;
};
#endif
更新后A.h为
#ifndef A
#define A
class B;
class A {
B* b;
};
#endif
更新后B.h为
#ifndef B
#define B
class A;
class B {
A* a;
}
#endif
由于类A,类B是相互独立的,不能因为先加载一个,后加载一个 而省略掉一个类的声明。