C++头文件相互引用,最好一个#include,另一个class C;

C++头文件相互#include时最好是:

(1)"CA.h" #include "CB.h".

(2)"CB.h"中用类的前向声明: class CA;

(3)最好加上头文件卫士( #ifndef ***   #define ***  #endif)

示例如下:

(1)"CA.h":

#ifndef HEADER_CA

#define HEADER_CA

 

#include "CB.h"

 

class CA

{

         CB* pB;

         CB b;//正确,因为此处已经知道CB类的大小,且定义了CB,可以为b分配空间

};

 

#endif

---------------

(2)"CB.h":

#ifndef HEADER_CB

#define HEADER_CB

 

class CA;//这个必须要用,不能只用#include "CA.h",如果只是#include "CA.h"而没有class CA;则会报错.原因如附录[1].

class CB

{

         CA* pA;

         //CA a;//错误,因为此时还不知道CA的大小,无法分配空间

};

 

#endif

 

---------------

(3)"CA.cpp":

#include "CA.h"

----------------------------------

附录:

[1].h的头文件是不能单独被编译的,必须放在.cpp.编译器在编译.cpp时会将该.cpp中的#include "*.h"中的头文件复制过来.例如在上面的"CA.cpp",编译器将#include展开后是:

(1)先将"CA.h"的内容复制过来:

#ifndef HEADER_CA

#define HEADER_CA

 

#include "CB.h"

 

class CA

{

         CB* pB;

         CB b;//正确,因为此处已经知道CB类的大小,且定义了CB,可以为b分配空间

};

 

#endif

(2)再处理(1),当遇到(1)中的 #include "CB.h" ,"CB.h"文件的内容再复制过来:

#ifndef HEADER_CA

#define HEADER_CA

 

//#include "CB.h" //此处被替换

         #ifndef HEADER_CB

         #define HEADER_CB

 

         class CA;//这个必须要用,不能只用#include "CA.h",如果只是#include "CA.h"而没有class    //CA;则会报错.原因如附录[1].

         class CB

         {

                   CA* pA;

                   //CA a;//错误,因为此时还不知道CA的大小,无法分配空间

         };

 

         #endif

 

 

class CA

{

         CB* pB;

         CB b;//正确,因为此处已经知道CB类的大小,且定义了CB,可以为b分配空间

};

 

#endif

-----------------------------

从上面代码可知,class CA;是正确的.

如果把class CA;换成#include "CA.h",则变为:

#ifndef HEADER_CA

#define HEADER_CA

 

//#include "CB.h" //此处被替换

         #ifndef HEADER_CB

         #define HEADER_CB

 

         #include "CA.h"//如果不用class CA;

         class CB

         {

                   CA* pA;

                   //CA a;//错误,因为此时还不知道CA的大小,无法分配空间

         };

 

         #endif

 

 

class CA

{

         CB* pB;

         CB b;//正确,因为此处已经知道CB类的大小,且定义了CB,可以为b分配空间

};

 

#endif

-----------------------------

编译器再处理时,又发现了#include "CA.h",则再把"CA.h"文件的内容复制过来:

#ifndef HEADER_CA        

#define HEADER_CA        //-------[1]

 

//#include "CB.h" //此处被替换

         #ifndef HEADER_CB

         #define HEADER_CB

 

                   //#include "CA.h"//如果不用class CA;

                   #ifndef HEADER_CA                            //-------[10]

                   #define HEADER_CA

 

                   #include "CB.h"

 

                   class CA

                   {

                            CB* pB;

                            CB b;//正确,因为此处已经知道CB类的大小,且定义了CB,可以为b分配空间

                   };

 

                   #endif                                                      //-------[100]

 

         class CB

         {

                   CA* pA;                                                  //-------[200]

                   //CA a;//错误,因为此时还不知道CA的大小,无法分配空间

         };

 

         #endif

 

 

class CA

{

         CB* pB;

         CB b;//正确,因为此处已经知道CB类的大小,且定义了CB,可以为b分配空间

};

 

#endif

编译器再分析时,发现[10]处的HEADER_CA 已经被定义([1]),所以不再定义[10]~[100]之间的代码(即绿色的部分).然后在[200]处定义CA  a时发现并没有声明CA(没有class CA),所以产生错误.

 

总之,如果二个头文件相互引用时,最好不是二个都用#include.

当然如果二个头文件中并没有用到另一个头文件中的类时,二个头文件是可以相互#include(可以像前面那样自己把#include展开分析):

(1)"CA.h":

#ifndef HEADER_CA

#define HEADER_CA

 

#include "CB.h"

 

class CA

{

         CB* pB;

};

 

#endif

---------------

(2)"CB.h":

#ifndef HEADER_CB

#define HEADER_CB

 

class CA;

#include "CA.h"

 

class CB

{

         CA* pA;

};

 

#endif

.cpp文件单独#icnlude “CA.h” 或者#icnlude “CB.h”都是正确的。

其中#icnlude “CB.h”为:

#ifndef HEADER_CB

#define HEADER_CB

class CA;

#include "CA.h"

class CB

{

CA* pA;

};

#endif

把第4行的#include "CA.h"再替换,得:

#ifndef HEADER_CB

#define HEADER_CB

class CA;

  #ifndef HEADER_CA

  #define HEADER_CA

  #include "CB.h"

  class CA

  {

  CB* pB;

  };

  #endif

 

class CB

{

CA* pA;

};

#endif

将第6行的#include "CB.h"替换,得:

 

#ifndef HEADER_CB

#define HEADER_CB

class CA;

 

  #ifndef HEADER_CA

  #define HEADER_CA

 

    #ifndef HEADER_CB

    #define HEADER_CB

    class CA;

    #include "CA.h"

    class CB

    {

    CA* pA;

    };

    #endif

  class CA

  {

  CB* pB;

  };

  #endif

class CB

{

CA* pA;

};

其中,绿色部分是无用,会被忽略。

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值