- 类的前置声明的作用是编译时告诉编译器这个符号在外部定义的,等到链接阶段自己去其他模块找
- 类的前置声明相对于函数的前置声明是不完整的,不涉及类的细节
- 因为前置声明不知道类的具体细节,不知道要给类分配多少内存空间,只能用来类的前置声明来定义类的引用或者指针,因为引用和指针的大小固定的
- 使用场合:类A与类B相互嵌套的情况
- 如果A.h 与 B.h 相互包含且没有避免重复包含的声明,会造成逻辑错误,编译不通过
- 如果有#pragama once,实际却仍旧无法读取到符号声明,例如
- a.h
#pragma once #include "b.h" class A { private: B* b; };
- b.h
#pragma once #include "a.h" class B { private: A a; };
- 因为:
- 编译B.cpp 时
- include B.h
- B.h接着要去include A.h
- A.h 去include B.h 发现包含过了 跳出
- 但是A里关于A的定义还是会被包含,里面却有一个类B,由于前面b.h没有被包含,B还没有被声明,这个B不认识
- 实际B.cpp 在包含后的代码是差不多是这样的
class B { private: A* a; }; class A { private: B* b; };
- a.h
- 将相应头文件换成类的前置声明就OK
- a.h
#pragma once class B; class A { private: B* b; };
- b.h
#pragma once class A; class B { private: A* a; };
- a.h
类前置声明的应用
最新推荐文章于 2023-05-17 11:20:34 发布