头文件互相包含问题

时间:2020-11-25 19:24:15

     在C++中,关于CPP的头文件互相包含的问题很让人头疼,其实我们谁也不愿意弄的结构混乱,难以理解,但有时又是有必须的。

     假定当前有两个头文件分别为 A.h  和 B.h,内容分别如下:

     A.h内容为:

     #ifndef  _A_H_

     #define _A_H_    

     #endif

 

     #include "B.h"

     class A

     {

          public:

          B  cl_b;

      };

 

    

     B.h内容为:

     #ifndef  _B_H_

     #define _B_H_    

     #endif

 

     #include "A.h"

     class B

     {

          public:

          A  cl_a;

      };

 

      编写相应的A.cpp和B.cpp,并编译,发现有错误提示,大意为类型不能找到。为何会出现这种情况?我们知道,C++编译器在编译源文件时采用的是预编译原则,对每一个数据总是需要知道其类型及大小。在A对象中要分配一块属于B的空间,而B中又有A的空间,是一个逻辑错误,因为在未完成预编译的情况下无法预知数据所占用的空间大小。

     

     根据指针的特点,指针在定义后并没有占用实际的内存空间,同时我们使用预先声明的方法,在VC编译环境下做如下修改:

     A.h内容为:

     #pragma once 

 

     #include "B.h"

 

     class B;

     class A

     {

          public:

          B  *cl_b;

      };

 

    

     B.h内容为:

     #pragma once 

 

     #include "A.h"

 

     class A;

     class B

     {

          public:

          A  *cl_a;

      };

 

      重新编译,OK,编译通过。我们发现,前置的声明还是很有用的,而此种情况下的宏定义却不能解决我们的问题。

 

      也看了不少的文章建议头文件的包含应该尽量放在.cpp当中,个人认为还是要从实际的情况来看,如果需要嵌套包含的类,其某些方法经常的被调用,就不适合在.cpp中临时创建、销毁类对象,因为这种反复的创建、销毁类对象,对系统资源是非常浪费的。