C++ 使用消息派遣类解决处理消息判断
生活随笔
收集整理的這篇文章主要介紹了
C++ 使用消息派遣类解决处理消息判断
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
這里只貼出代碼,不做過多說明。 個(gè)人原創(chuàng)測(cè)試!
1 // TestFuction.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。 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) ; //消息處理函數(shù) 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 }經(jīng)過實(shí)際測(cè)試上面代碼思路基本正確,但在現(xiàn)實(shí)中使用會(huì)出錯(cuò)誤,糾結(jié)原因 是因?yàn)?m_obj 是引用,在引用構(gòu)造的時(shí)候 ,對(duì)象還沒構(gòu)造完畢,所以可能造成構(gòu)析構(gòu)問題,所以將 m_obj 改用指針 經(jīng)過測(cè)試正常!!
?
轉(zhuǎn)載于:https://www.cnblogs.com/wolfrickwang/p/3713222.html
總結(jié)
以上是生活随笔為你收集整理的C++ 使用消息派遣类解决处理消息判断的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么创业者专注做一个产品最好?
- 下一篇: 椭圆曲线加密算法(ECC)原理和C++实