您的位置:首页 > 其它

前向声明 前置声明 Forward Declare

2015-08-21 19:27 267 查看
网上关于前向声明的介绍不多,简单写一下吧。

先举个例子:

//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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: