日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 使用消息派遣类解决处理消息判断

發(fā)布時(shí)間:2025/3/21 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。