C++ 使用消息派遣类解决处理消息判断
这里只贴出代码,不做过多说明。 个人原创测试!
1 // TestFuction.cpp : 定义控制台应用程序的入口点。 2 // 3 #include "stdafx.h" 4 5 #include<iostream> 6 using namespace std; 7 8 enum MsgTest{FirstMsg = 0,SencondMsg,EndMsg}; //定义所有消息 9 10 template<class CHandleClass> 11 class CMessageHanldImp 12 { 13 public: 14 CMessageHanldImp(CHandleClass & obj); 15 ~CMessageHanldImp(); 16 17 18 private: 19 typedef int (CHandleClass::*Handler)(MsgTest msg) ; //消息处理函数 20 CHandleClass & m_obj; 21 Handler m_handers[EndMsg]; 22 23 public: 24 void SetNewHandler(MsgTest msg,Handler handler); 25 int HandleMsg(MsgTest msg); 26 27 }; 28 29 template<class CHandleClass> 30 CMessageHanldImp<CHandleClass>::CMessageHanldImp(CHandleClass & obj) 31 : m_obj (obj) //引用类型的成员必须提供显示初始化 32 { 33 memset(m_handers, 0, sizeof(m_handers) * EndMsg); 34 } 35 36 template<class CHandleClass> 37 CMessageHanldImp<CHandleClass>::~CMessageHanldImp() 38 { 39 } 40 41 template<class CHandleClass> 42 void CMessageHanldImp<CHandleClass>::SetNewHandler(MsgTest msg,Handler handler) 43 { 44 m_handers[msg] = handler; 45 } 46 47 template<class CHandleClass> 48 int CMessageHanldImp<CHandleClass>::HandleMsg(MsgTest msg) 49 { 50 if(m_handers[msg]) 51 { 52 return (m_obj.*m_handers[msg])(msg); 53 } 54 return 0; 55 } 56 57 class CTestHandle 58 { 59 public: 60 CTestHandle(); 61 ~CTestHandle(); 62 63 int DoMsg(MsgTest msg); 64 65 private: 66 int DoFirstMsg(MsgTest msg); 67 int DoSecondeMsg(MsgTest msg); 68 69 private: 70 CMessageHanldImp<CTestHandle> *m_messageLoop; 71 72 }; 73 74 CTestHandle::CTestHandle() 75 { 76 m_messageLoop = new CMessageHanldImp<CTestHandle>(*this); 77 m_messageLoop->SetNewHandler(FirstMsg,&CTestHandle::DoFirstMsg); 78 m_messageLoop->SetNewHandler(SencondMsg,&CTestHandle::DoSecondeMsg); 79 } 80 81 CTestHandle::~CTestHandle() 82 { 83 delete m_messageLoop; 84 } 85 86 int CTestHandle::DoFirstMsg(MsgTest msg) 87 { 88 cout<<"DoFirstMsg"<<endl; 89 return 0; 90 } 91 int CTestHandle::DoSecondeMsg(MsgTest msg) 92 { 93 cout<<"DoSecondeMsg"<<endl; 94 return 0; 95 } 96 97 98 int CTestHandle::DoMsg(MsgTest msg) 99 { 100 m_messageLoop->HandleMsg(msg); 101 return 0; 102 } 103 104 int _tmain(int argc, _TCHAR* argv[]) 105 { 106 CTestHandle testHandle; 107 testHandle.DoMsg(FirstMsg); 108 testHandle.DoMsg(SencondMsg); 109 return 0; 110 } 经过实际测试上面代码思路基本正确,但在现实中使用会出错误,纠结原因 是因为
m_obj 是引用,在引用构造的时候 ,对象还没构造完毕,所以可能造成构析构问题,所以将
m_obj 改用指针 经过测试正常!!
转载于:https://www.cnblogs.com/wolfrickwang/p/3713222.html
C++ 使用消息派遣类解决处理消息判断相关推荐
- icmp消息类型报告传输_ICMP消息的类型和ICMP消息格式
icmp消息类型报告传输 ICMP shares error reporting and devices status by messages. Messages created by ICMP ar ...
- Netty消息接收类故障案例分析
<Netty 进阶之路>.<分布式服务框架原理与实践>作者李林锋深入剖析Netty消息接收类故障案例.李林锋此后还将在 InfoQ 上开设 Netty 专题持续出稿,感兴趣的同 ...
- rabbitmq可靠性投递_解决RabbitMQ消息丢失问题和保证消息可靠性(一)
工作中经常用到消息中间件来解决系统间的解耦问题或者高并发消峰问题,但是消息的可靠性如何保证一直是个很大的问题,什么情况下消息就不见了?如何防止消息丢失?下面通过这篇文章,我们就聊聊RabbitMQ 消 ...
- Java架构学习(五十一)微信公众号开发混合开发技术流程微信推送原理外网映射工具使用微信公众号接口认证代码获取微信客户端信息解决微信消息幂等问题
一.微信公众号项目 SOA架构:面向接口开发,也就是相当于把传统的那种ssh项目的业务逻辑层抽取出来 做成接口. SSH架构与分布式架构的区别 SSH架构是整个项目的任何模块都在一个项目里面 分布式架 ...
- C++游戏编程教程(六)——C++字符串消息处理器类
大家好,我是一位初一的编程爱好者.今天,我向大家介绍一个我自制的C++字符串消息处理器类.看到标题,大家可能有些疑惑,字符串消息处理器怎么能和游戏编程扯上关系呢?其实,很多游戏中都需要用到消息处理,特 ...
- 微信公共平台消息回复类
<?php /** * 微信公共平台消息回复类 * * */ class BBCweixin{ private $APPID="******"; privat ...
- 基于Confluent.Kafka实现的KafkaConsumer消费者类和KafkaProducer消息生产者类型
一.引言 研究Kafka有一段时间了,略有心得,基于此自己就写了一个Kafka的消费者的类和Kafka消息生产者的类,进行了单元测试和生产环境的测试,还是挺可靠的. 二.源码 话不多说,直接上代码,代 ...
- 解决RabbitMQ消息丢失与重复消费问题
解决RabbitMQ消息丢失与重复消费问题 参考文章: (1)解决RabbitMQ消息丢失与重复消费问题 (2)https://www.cnblogs.com/sessionbest/articles ...
- Kafka是什么,JMS是什么,常见的类JMS消息服务器,为什么需要消息队列(来自学习笔记)
1.Kafka是什么 Apache Kafka是一个开源消息系统,由Scala写成.是由Apache软件基金会开发的一个开源消息系统项目. Kafka最初是由LinkedIn开发,并于2011 ...
最新文章
- linux cmake 交叉编译配置 简介
- 解决 Intellij IDEA 文件图标一直闪烁
- 一些 Linux 系统故障修复和修复技巧
- 如何手动创建SAP S/4HANA的生产订单
- Shell学习之结合正则表达式与通配符的使用(五)
- RFM模型——构建数据库营销的商业战役!(转)
- 2021考研英语备考规划
- iOS 的 APP 如何适应 iPhone 5s/6.6s/6.6sPlus 三种屏幕的尺寸?
- 软件配置--ubuntu16.04
- 服务器双网卡连接内外网配置
- 兄弟7180dn拆机_兄弟DCP-7010拆机图解
- 使超星数字图书馆的PDG文件转换为PDF文件的方法
- 编程语言大牛王垠的过去和现状
- HDU-1869 六度分离
- 学习OpenCV(4) 基于OpenCV的双目测距程序
- Sources for ‘Android API 32 Platform’ not found
- Warm-up pytorch代码
- c++自定义弹窗_性价比APS-C相机购机建议 尼康Z 50真实感受
- 帝国cms如何域名html的专题,帝国cms整站更换新老域名详细操作方法
- 桌面运维用到的网站(转载)