SCW 开发心得: 为何要使用私有类? C++私有类实现要点及心得整理

基于DirectUI 的SCW- C++私有类实现要点及心得框架

2015.03函数

 

 

在设计 SCW 的过程当中。不断了解新知识,做为一个C++初学者,新的知识尤如甘露。尤为在学习过程当中,看到别人好的经验与方法,就像发现了新大陆同样。SCW框架虽然还在构建中,还没到 DirectUI那一步,但学习与开发的过程,充满惊喜。工具

 

这两天在重构SCW,这已是第三稿了。虽然个人基础浅薄,知识不深,但我懂得一个道理。若是想弄个好点的SCW界面开发工具出来。没有好的框架,后面实现所谓的DirectUI 都是虚的。要想作个理想一点的框架,就得学好基础知识。学习

所以,这几天,我从新去回个头来看看C++类结构方面的知识,仔细,认真理解C++对内存与指针的管理。你网上漫游中,终于找到了一些好的知识点。其中C++类中经过私有类来实现类的兼容与扩展,提升类的框架适应度,封装类的思路的经验。就是好的收获。开发工具

 

私有类的实现,在QT中被广泛使用。QT 中的 Q_D, Q_Q, 就是对私有类的引用接口。经过二天的了解与实操,如今将私有类的一些认识总结出来。测试

 

在第一次接触到这个概念时,我一样也有如下几下疑问:优化

1.    什么是私有类的实现?spa

2.    如何来实现?.net

3.    私有类有什么必要性?为何要引用私有类这种概念或方法设计

4.    有什么弊端?

 

经过学习,加上本身动手实践,以上的问题,被我一一解决或理解。并且,也决定,在作 DirectUI SCW界面框架时,用上这个好方法。

 

1.先说说什么是私有类的实现

简言之,就是在一个类ClassA中,经过私有的另外一个类ClassB,来实现大部分的功能。而且ClassB只为 ClassA服务,也就是说,其余的类,是不能直接访问 ClassB的,这就是 ClassA的私有类。

 

初看起来,好像没有必要,由于设计一个类,就是想达到某一任务或目的。直接用这个类来完成就好了。为何还要经过另一个类来实现呢?这就引出了第二个问题,用私有类有什么好处?

 

咱们须要展开来讲说私有类的实现,才能更好地理解这种实现的好处:

ClassA 引用私有类ClassB, 不是简单地想经过 ClassB 来实现其功能而已。若是仅是这样,真没有必要。直接用ClassA不更好?事件不是这样简单。ClassA 之因此使用私有类,有结构上的优点与必要。先来看看他的实现:

归纳总结一下私有类的实现重点:

  1. 在主类.h头文件中声明主类主体结构。同时声明主类须要引用到的私有类的友元关系(即 friend class classB)并声明一个访问私有类的成员变量 classB b 或接口;

  2. 2.    不须要在主类.h头文件中include包含私有类头文件。也不要在工程任何一个.h头文件中include包含私有类的.h头文件。这是重点。

  3. 在主类的实现源文件(.cpp)中包含主类.h头文件和私有类.h头文件。同时在源文件中实现主类与私有类的功能。(也能够分别用几个.cpp来分别实现主类和私有类,代码写在哪都不不影响。)

 

举例实现以下:

文件class_a.h

class ClassA {
protected:
    friend class classB; // 声明友元关系
public:
    classB  b; // 私有类访问入口
    void func()
……
}

 

再在另外一个头文件class_b.h 中声明 classB.的类的结构主体。(具体就不书写了)

 

重点来了,在实现 classA的代码文件classA.cpp中。同时包含 class_a.h, class_b.h.

这样,classB 类以及classB.h文件就实现了私有性,class_b.h文件只在 classA.cpp文件中被引用。在工程中的其余任何地方,都不须要引用class_b.h头文件。

 

这个时候,能够设想一下,任意修改 classB类的结构即修改class_b.h头文件,都不会对工程中的其余模块有影响。甚至也不会影响 class_a.h文件。

 

至于哪些功能放在 classA 来实现,哪些功能要 classB来实现,这就是本身我的的设计思路与安排了。你甚至完成不须要 classA来实现任何具体内容,仅做为一个接口性的类也行。

 

再举个小例子:

classA 想实现 x, y 值的读取与写入。classA 只需这样来实现.

class classA
{
    int X(int value = 0, boo IsWirte = false) {
      if (IsWrite) // 写入标志
        b->x = value; // 假设 b 是 classA的私有类对象
        return b->x;
    };
    // y 的实现同上
}


A简化了要声明成员变量x,一个函数就解决了读写。固然,这只是一个简单示例,更多的实现须要我的去挖掘。

 

若是看到这,你能想到了点些什么,说明你开始理解私有类的必要性了。

为何要使用这样的结构?这正是私有类存在的核心。也正是私有类的好处好处与必要性所在。

 

2.使用私有类的好处。

 

通上上面的简单的说明,咱们能够初步发现,私有类的几个好处。

  1. 能够简化主类的结构。

  2. 能够封装主类的功能。

  3. 主类功能的扩展在私有类中实现,不会影响主类的头文件结构。好比声明中间变量,添加一些中间处理函数等。

  4.   大大提高了主类的兼容性与扩展性。

  5. 能够达到隐藏设计思路的目的(这个仅做参考)

 

 

用以上小例子来讲明一下:

ClassA, 咱们须要再添加一个功能,在设置 X的值时,须要检测一下X的大小,而且限定在 >0而且 <N。固然,咱们能够直接在 classA的结构中添加一个常量N,并修改 X()函数代码达到目的 。可是,这样 classA.h 的结构被改动,头文件会被从新编译,工程中引用到classA的其余文件也会被从新编译,若是这个classA是深底层性的基类,并且你的工程很大,文件不少的话,可想而知。

 

若是咱们仅是修改 classB的头文件,和.cpp代码文件,这种状况就不会发生。虽然都是一样的目的,一样的修改,可是产生的结果大不同。

 

实际状况会更复杂。咱们只是用一个简单例子来引伸一下。实际应用中,咱们可能会为完成一些新的任务,须要添加新的变量和处理函数。可是,若是这些添加都是在 classB中完成,classA的结构一点都不须要动。这样保证了classA的兼容性,同时也达到了扩展 classA的功能的目的。同时减小了对头文件的依赖。

 

具体应用场景本身去设想一下。若是 classA 须要在更新中不断添加新功能,新变量。你甚至不须要改动 classA的任何结构,而只是 直接调用 classA 的私有成员来实现(固然,不建议这样实现)。例如 A.PrivateObject()->newfunc(). A.PrivateObject()->Width = 100; 诸如此类的实现可能。

 

若是 classA 是对外发布的 dll文件中的公共引用类,classA每一次结构的修改,都会对被 dll版本的更新带来不兼容的可能性。设计科学的私有类,能够达到优化程序或库文件的二进制代码的兼容性。

 

 

 

3. 弊端。

 

相对于优势来讲,使用私有类的弊端,能够说一点都不是个事。

  1. 代码量增多。由于功能实现了转接,需在在主类添加一些转接性的代码,同时也增长了工做量。

  2. 代码再也不清晰明。之前直接处理的功能再也不直接。对后来的开发者来讲,须要花更多的时间去熟悉了解。

  3. 尤为在修复BUG时,由于再也不直接明了的流程,须要从新回塑设计思路。

  4. 若是设计不当,私有类反而会带来麻烦。让程序结构显得混乱。

 

4. 要点:

合理使用类的私有类实现方法。能够达到以上说的好处。

只对重要的类才进行私有类的设计。不要什么类都实现私有类。

要有一套统一的实现方法,好比设计一些方便的宏,规范统一的转接口标准等。

要想更好地理解私有类,建议去深刻QT中类的实现。并本身动手设计案例来完成一些测试。

 

之前在刚学习类的概念时,我就认为,类已是一种很好的封装与兼容了。

可是,咱们在设计好一个类以后,会由于知识的积累或需求的增长,也可能由于客户的需求或功能的丰富,常常性地去完善一个类。在没有私有类这个概念的时候,咱们通常都是直接在类的原始结构上添加新成员变量或成员函数来完成这些修改。若是引用私有类的概念,主类的原始结构就不须要过多的修改甚至不做任何修改。类的封装与兼容获得了进一步的升华!

        

我已经在个人 SCW 界面库中采用了私有类。并测试完善了私有类的应用。


SCW 的我的想法,请参阅: 基于DirectUI的SC设计规划的我的构想与目标


SCW DirectUI界面设计交流,请加 QQ: 177312461   或我的QQ: 48018276 

相关文章
相关标签/搜索