一,问题提出:
- class
B; -
- class
A - {
- public:
-
B b; - };
-
- class
B - {
- public:
-
A a; - };
以上写法会造成头文件相互包含,是错误的。
我们只需要把其中的一个A类中的B类型成员改成指针形式 就可以避免这个无限延伸的怪圈了。
为什么要更改A而不是B?因为存在先后顺序问题-->因为C++编译器自上而下编译源文件的时候,对每一个数据的定义,总是需要知道定义的数据的类型的大小。在预先声明语句classB;之后,编译器已经知道B是一个类,但是其中的数据却是未知的,因此B类型的大小也不知道。这样就造成了编译失败,
:
二,前置声明:
- //文件A.h中的代码
- #pragma
once - #include
"B.h" - class
A - {
- public:
-
B* b; - };
-
- //文件B.h中的代码
- #pragma
once - #include
"A.h" - class
B - {
- public:
-
A* a; - };
error C2501: 'A' : missing storage-class or typespecifiers
仍然是类型不能找到的错误。其实这里仍然需要前置声明。分别添加前置声明之后,可以成功编译了。代码形式如下:
- //文件A.h中的代码
- #pragma
once - #include
"B.h" - class
B; //前置声明 -
- class
A - {
- public:
-
B* b; - };
-
- //文件B.h中的代码
- #pragma
once - #include
"A.h" - class
B; -
- class
B - {
- public:
-
A* a; - };
[由上可见]:
三、两点原则
转自 http://blog.sina.com.cn/s/blog_5daeefb30100n19z.html