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