• 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   改用指针 经过测试正常!!
  • 相关阅读:
    Python的简单介绍/解释器/变量/变量的数据类型/用户交互及流程控制(if)
    变量
    hello python
    页面默认值显示
    java 获取时间区间
    java Set 中 removeAll 与 addAll
    命名的数据库实例
    linux 打包与解包
    缓存工作原理
    java 格式化日期(转)
  • 原文地址:https://www.cnblogs.com/wolfrickwang/p/3713222.html
Copyright © 2020-2023  润新知