尽量不要在头文件中包含另外的头文件

//原创文章,不得转载


这是一个原则!

通常当用到一个类的时候,我们会在文件头开头处包含相关类的头文件如:

//user.h

class CUser

{

 pulic:

      char m_strchUserName[100];

       int   m_nUserID;

}




//meeting.h


#include"user.h"


class CMeeting

{

pulic:

CMeeting();

~CMeeting();


    CUser *  m_User[100];


   void   add_user( CUser * pUser  , int i );

}


//meeting.cpp

CMeeting::CMeeting()

{

}

CMeeting::~CMeeting()

{

}


void  CMeeting::add_user( CUser * pUser  , int i )

{

          m_User[ i ] = pUser;

}


从上述例子中,可以看到标准的,一般的做法,在meeting.h头文件中包含user.h, 因为 这里用到了CUser类。

一般在用到相应类型的时候,自然的会去包含响应的头文件。


下面,解释一下:尽量不要在头文件中包含另外的头文件,而是对对序下文中可能用到的类进行前置声明(forward declaration)。

引用书上的一段话:

对程序下文中可能用到的类进行前置声明(forward declaration)。

它们会告诉编译器,我们用到的这些类已经存在了,并且不需要知道这些类的完整定义。

我们为什么要这样做,而不是将它们的头文件包含进来呢?

这主要是由于在程序下文中,我们只是简单的定义了指向这些类的对象的指针,而并没有涉及到该类的其他方面。


这样做的好处:

一是:避免了头文件被其他文件多次包含,尤其是在头文件中包含头文件时,容易造成重复包含和产生包含顺序问题,并且增大了文件的体积;

二是:提高了编译速度,因为编译器只需知道该类已经被定义了,而无需了解定义的细节。


一种好的编程风格是,尽量在头文件中使用类前置声明程序下文中要用到的类,实在需要包含其它的头文件时,可以把它放在我们的类实现文件中。

关于前置声明,可以参考其它文章。


根据这个原则,可以将上述例子修改为:

//meeting.h


class CUser;    //#include"user.h"   //在头文件中,将文件包含修改为类的前置声明;


class CMeeting

{

pulic:

CMeeting();

~CMeeting();


    CUser *  m_User[100];


   void   add_user( CUser * pUser  , int i );

}


//meeting.cpp

#include"user.h"      //在cpp文件中添加类的包含;

CMeeting::CMeeting()

{

}

CMeeting::~CMeeting()

{

}


void  CMeeting::add_user( CUser * pUser  , int i )

{

          m_User[ i ] = pUser;

}



从修改的程序看,如果CMeeting类 和 CUser类 是封装在一个 动态链接库(dll)中的两个类。

 CMeeting是导出类。

导出的dll为, UserMeeting.dll;


这样就可以实现CUser类细节的封装到dll中,同时减少外部文件依赖。

你可能感兴趣的:(尽量不要在头文件中包含另外的头文件)