zoukankan      html  css  js  c++  java
  • 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   改用指针 经过测试正常!!
  • 相关阅读:
    Jmeter之http性能测试实战 非GUI模式压测 NON-GUI模式 结果解析TPS——干货(十一)
    UI Recorder 自动化测试 回归原理(九)
    UI Recorder 自动化测试 录制原理(八)
    UI Recorder 自动化测试 整体架构(七)
    UI Recorder 自动化测试 配置项(六)
    UI Recorder 自动化测试 工具栏使用(五)
    UI Recorder 自动化测试 回归测试(四)
    UI Recorder 自动化测试 录制(三)
    UI Recorder 自动化测试工具安装问题疑难杂症解决(二)
    UI Recorder 自动化测试安装教程(一)
  • 原文地址:https://www.cnblogs.com/wolfrickwang/p/3713222.html
Copyright © 2011-2022 走看看