前向声明 前置声明 Forward Declare
2015-08-21 19:27
267 查看
网上关于前向声明的介绍不多,简单写一下吧。
先举个例子:
1、前向声明用于降低inclusion tree的复杂程度,降低模块间的耦合度。
2、前提是前向声明的类foo只能用来定义指针,而不可以定义实体对象,因为指针占用的空间大小固定,而类实体占用的空间大小必须引入头文件才能确定。
3、实现方式是在util.h头文件中
声明类foo,而不引入头文件foo.h。
关于这点,你可能会说,即使util.h文件里不包含foo.h,但是你util.cpp文件中仍然要包含foo.h。的确。那么问题来了,如果别人要使用你的util类,就不需要知道foo类的相关信息了。如果即使foo发生改变,引用util.h的那文件,也不需要重新编译了。如果你将foo和util封装成库,那只需要公开util.h就可以了,foo.h根本不需要露面,也就加强了封装性。否则,你发布的库还必须带着foo.h一起发布。
4、对于类和结构体,都可以用以上方式进行声明,但是对于结构体,有一种情况是无法前向声明的:
typedef struct{……}MyStruct, *MyStruct;
对于这种形式,你是无法用MyStruct进行前向声明的。所以尽量不要将结构体设计成这种形式,哪怕非得这样写,也给它个名字,以便前向声明:
typedef struct _MyStruct{……}MyStruct, *MyStruct;
先举个例子:
//foo.h class foo {......}; //util.h class foo; class util { private: foo* m_foo; };
1、前向声明用于降低inclusion tree的复杂程度,降低模块间的耦合度。
2、前提是前向声明的类foo只能用来定义指针,而不可以定义实体对象,因为指针占用的空间大小固定,而类实体占用的空间大小必须引入头文件才能确定。
3、实现方式是在util.h头文件中
声明类foo,而不引入头文件foo.h。
关于这点,你可能会说,即使util.h文件里不包含foo.h,但是你util.cpp文件中仍然要包含foo.h。的确。那么问题来了,如果别人要使用你的util类,就不需要知道foo类的相关信息了。如果即使foo发生改变,引用util.h的那文件,也不需要重新编译了。如果你将foo和util封装成库,那只需要公开util.h就可以了,foo.h根本不需要露面,也就加强了封装性。否则,你发布的库还必须带着foo.h一起发布。
4、对于类和结构体,都可以用以上方式进行声明,但是对于结构体,有一种情况是无法前向声明的:
typedef struct{……}MyStruct, *MyStruct;
对于这种形式,你是无法用MyStruct进行前向声明的。所以尽量不要将结构体设计成这种形式,哪怕非得这样写,也给它个名字,以便前向声明:
typedef struct _MyStruct{……}MyStruct, *MyStruct;
相关文章推荐
- iOS将数组中的内容分拼接成字符串
- HDU 5410 CRB and His Birthday(01背包+完全背包)
- 二叉树遍历求差值绝对值最大值
- C++中虚函数与晚绑定的编译器实现
- 访问者模式
- zoj 3878 Convert QWERTY to Dvorak【好坑的模拟】
- zoj3878Convert QWERTY to Dvorak(打表)
- 卡尔曼滤波应用与讲解(x未完成x)
- windows编程之剪切板
- 一个可以即插即用的MD5加密签名方式
- 文件扩展名批量修改器
- 程序员的生活充满压力,但你不能放弃!
- fzu 2135 数字游戏 【水题】
- Convert QWERTY to Dvorak (字符串)
- ubuntu15.04安装chrome
- C 头文件之<ctpye.h>
- CSU 1511 残缺的棋盘
- 安卓mapbox实现收藏地点功能
- 【Android】网络通讯
- 如何学习iOS开发?iOS Developer Library足矣!