找回密码
 立即注册

C++老鸟日记020 嵌套结构,类的嵌套定义

发表于 2018-9-13 18:19:29 | 显示全部楼层 |阅读模式
本帖最后由 baizy77 于 2018-9-16 10:34 编辑

微信公众号: 星点课堂
新浪微博:女儿叫老白
网易云课堂:女儿叫老白
网易云课堂免费课程:《C++跨平台开发中的编译错误》
网易云课堂免费课程:《C++老鸟日记》
----------------------------------------------------------------------------
引言:
----------------------------------------------------------------------------
       在进行类设计的时候,有些功能或接口可能集中属于某一个功能块,而且该部分接口只会在当前类中使用或者提供。这时候,我们就可以通过嵌套的结构或者嵌套类的设计来实现。

正文:
----------------------------------------------------------------------------
       嵌套类的设计一般用在紧密相关的两个类中。
  1. // item.h
  2.        class CGraphItem {
  3.        public:
  4.     ……
  5.     bool deSerializeBinary(QDataStream&ds);
  6.        private:
  7.     // 端子类,用于表示图元上的端子,该类不对外暴露。它提供的功能通过CGraphItem对外提供。CGraphItem仅提供外部所需的接口,其他接口对外隐藏。
  8.     classCTerminal
  9.     {
  10.     public:
  11.         booldeSerializeBinary(QDataStream& ds);
  12.     };
  13. private:
  14.     CTerminal* m_pTerminal[2];
  15. };
复制代码

  1. // item.cpp
  2. bool CGraphItem::deSerializeBinary(QDataStream& ds)
  3. {
  4.     ……
  5.     if (NULL != m_pTerminal[0])
  6.         m_pTerminal[0]->deSerializeBinary(ds);
  7.     if (NULL != m_pTerminal[1])
  8.         m_pTerminal[1]->deSerializeBinary(ds);
  9.     return true;
  10. }

  11. bool CGraphItem::CTerminal::deSerializeBinary(QDataStream&ds)
  12. {
  13.     ……
  14.     return true;
  15. }
复制代码

       上述代码中,图元类CGraphItem需要提供图元封装功能,图元上有端子,而图元类只需要把需要对外提供的接口(比如序列化接口deSerializeBinary())暴露出来,而把CTerminal作为私有的类进行了封装。当然也可以把CTerminal类作为public嵌套。这样,外部就可以直接使用该类了。

结语:
----------------------------------------------------------------------------
       嵌套结构或嵌套类的设计在软件研发过程中不太常用,但是如果两个类具有密切关系并且独立性不强的话,可以考虑以嵌套的方式进行设计。

回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
包含关系。
   如果我要定义一个对象。  那么CGraphItem  member;  
   那么member.m_pTerminal[0]   这样就会报错。 会不会?   
这样就只能用CGraphItem   里面的成员函数做处理了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
tan 发表于 2018-9-14 21:15
包含关系。
   如果我要定义一个对象。  那么CGraphItem  member;  
   那么member.m_pTerminal[0]   这样 ...

会报错。因为访问了私有成员变量。只能通过CGraphitem的接口处理。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

baizy77

    主题

    帖子

    60

    积分

    Qter1级会员

    Rank: 1

    积分
    60

Qter1级会员

发私信

Qt开源社区——开源 共享 自由

微信扫一扫
查看精品教程!