分享

C++对象之间通信的三种常见方式

 guitarhua 2017-01-12

经过这一年多对C++的使用,总结出了下边的三种常见对象之间的通信方式。这里就不上代码了。只作为一种设计思想,记录下来方便自已以后使用,和大家一起学习,这只是自已在工作中的总结,如果谁有更好的经验,请回复我,我再加进去。

1:使用一个全局单例对象作为交互对象的中介;

在这种交互方式中,有三个对象参加进来。

类1:ClassA;             //用来创建交互对象1:obj1

类2:ClassB;             //用来创建交互对象2:obj2

类3:ClassC;             //单例类,用来创建单例对象:objS

如果obj1现在要给obj2发送一条消息,就要先从objS中取得obj2的对象指针地址。然后通过这个地址把消息发送给obj2。当然,用同样的方法,我们也可以让obj2给Obj1发送消息。

这里使用时要注意的问题有两个。

      1) obj1给obj2发送消息时,objS中存的obj2对象地址不能为空

      2) 当创建obj2时,要马上把obj2的实例地址传送给单例objS,在销毁obj2时,要马上把obj2在单例objS中保存的对象地址清空为NULL

C++对象之间通信的三种常见方法 - ♂苹果 - 眼睛想旅行

 

2:为交互的对象创建一个虚接口代理类;

     这种方式,适合自已常常要给第三方发回调消息的对象,比如按钮或者控件什么的。因为自已包含于目标对象,所以比较方便设置代理,也可以使用目标对象对控件对象对外组合封装起来。

     这种交互方式中,有两个对象参加进来,创建类时,需要创建发消息对象的虚代理类。在而目标对象要继承这个虚代理类并实现这个代理类的虚方法。他和第三种方式相比,优点是可以创建多条消息通道。

类1:ClassA;              //用来创建交互类ClassC,将作为obj1的一个父类

类2:ClassB;              //用来创建发送消息的对象2:obj2

虚接口类:ClassX;    //用来实现交互,在obj2中会包含一个ClassX的实例类型变量。以方便保存obj1的对象地址。

类3: ClassC;               //继承自ClassA和ClassX,用来创建交互对象1:obj1

C++对象之间通信的三种常见方法 - ♂苹果 - 眼睛想旅行

3:创建交互对象的基类方法函数指针。

       这种方式和第二种其实是差不多的,只是这种方式,比较适合只有一条回调消息的情况。这里只有两个对象,和一个对象方法函数指针。这里只强调一下,对象函数指针的定义方式。

       类1:ClassA;                               //用来创建交互对象1:obj1

       类2:ClassB;                                //用来创建交互对象2:obj2

这里说明一下obj1和obj2的方法函数指针都怎么创建:

      假如:

               ClassA有一个对象方法,void func1(); 我们给这个方法定义一个指针类型如下

               typedef  void  (ClassA::*FUNC1)();

        在对象obj2中就可以定义这么一个FUNC1类型的对象指针。定在创建obj1中创建obj2时把obj1的这个FUNC1的指针类型赋上obj1的回调方法指针。这样就可以在obj2中使用使用obj1的这个对象方法指针调用obj2的回调方法了。 请看图:

C++对象之间通信的三种常见方法 - ♂苹果 - 眼睛想旅行

第一种方法最常用容易理解,第二方法速度快,第一种与三种结合适合批量对象交互,可组成MVC或观察着模式。
UML图画的并不标准,正在学习中。

欢迎转载,转载注明出处:http://fengmm521.blog.163.com/blog/static/25091358201421292224959/

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多