尽量不要在头文件中包含另外的头文件
来源:互联网 发布:hbase查找数据方式 编辑:程序博客网 时间:2024/06/05 18:23
//原创文章,不得转载
这是一个原则!
通常当用到一个类的时候,我们会在文件头开头处包含相关类的头文件如:
//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中,同时减少外部文件依赖。
- 尽量不要在头文件中包含另外的头文件
- 不要在头文件中使用using namespace 并尽量少include 文件
- 尽量不要再头文件中定义全局变量
- C语言中尽量不要在头文件中定义变量
- 在类的头文件中尽量少引入其他头文件 <<Effective Objective-C>>
- 第二篇: 在类的头文件中尽量少引入其他头文件
- 头文件的包含以及命名空间的引入尽量写在cpp文件中
- 在头文件中尽量少引入其他文件
- 不要在头文件中定义变量
- C++ 在.h文件中包含头文件和在.cpp文件中包含头文件的原则
- 不要在头文件中定义有链接的实体
- 最好不要在头文件里面包含定义变量
- 头文件的包含
- 在glsl 中模拟包含头文件的方法
- Effective Objective-C 2.0 第2条:在类的头文件中尽量少引入其它头文件
- OC代码习惯----在头文件中尽量少import其他头文件
- WTL头文件中包含的类
- WTL头文件中包含的类
- 【js设计模式笔记---接口】
- 64位linux 系统运行32位程序解决方法
- iOS7—Day by day—Day15:CoreImage Filters
- Hadoop MapReduce2.0(Yarn)
- 解析Jquery取得iframe中元素的几种方法
- 尽量不要在头文件中包含另外的头文件
- SPI
- 示波器的采样率和存储深度(有改动)
- spring-framework-reference 4.x中文翻译
- 任正非:未来华为还是以硬件为主
- Android开发之可以动态刷新的显示数据的曲线图
- Android权限(permission)大全
- android背景设置报错 <item> tag requires a 'drawable' attribute or child tag defining a drawable
- iOS7—Day by day—Day16:Decoding QR Codes With AVFoundation