前向声明 前置声明 Forward Declare



网上关于前向声明的介绍不多,简单写一下吧。

先举个例子:

//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;


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值