这里只贴出代码,不做过多说明。 个人原创测试!
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 改用指针 经过测试正常!!