类内函数指针数组

如若转载请保持本文完整性,及保留博客地址

 

改定履历

2010-12-17---------------------新建文本文档

 

正文

 

        首先是头文件中重定义函数指针类型


class CVLCMediaPlayerDlg; typedef void (CVLCMediaPlayerDlg::*pf) (void); //! 定义指向CVLCMediaPlayerDlg类成员函数的函数指针类型pf --类内函数指针定义必须加上类域限定符 class CVLCMediaPlayerDlg:public CDialog { ... pf m_pf[4]; //! 函数指针数组 map<int,int> m_pfMap; //! 消息与函数指针的映射 };

 

示例程序背景:


        类内线程启动及结束时会向本窗口发送相关消息,窗口接收到消息后调用相应方法处理消息

思路:


        因为在消息较多的情况下,用switch语句会导致代码量过多问题,所以考虑采用函数指针来解决.当然可以采用将消息和函数指针做个映射的方式.但本次学习的目的在于学习指针数组.所以确定思路为,将消息与函数指针数组下标做映射,取得数组下标后得到函数指针调用函数.

在构造函数中初始化函数指针数组及做消息-下标映射

{ pf pfTmp[] = {ThreadLogStartHandle, ThreadLogExitHandle, ThreadSDPStartHandle, ThreadSDPExitHandle}; int nSize = sizeof(pfTmp)/sizeof(int*); for (int i=0; i<nSize; i++) { m_pf[i] = pfTmp[i]; //m_pfMap.insert(map<int,int>::value_type(mediaThread[i],i)); m_pfMap.insert(make_pair(g_mediaThread[i],i)); } } 消息处理器中,通过函数指针调用成员函数 LRESULT CVLCMediaPlayerDlg::OnMediaMsgHandle(WPARAM wParam, LPARAM lParam) { UINT ui = m_pfMap[wParam]; //! 取得数组下标 (this->*m_pf[ui])(); //! 调用函数(这里必须使用this->调用,否则发生C2064错误,参考MSDN) return S_OK; }

你可能感兴趣的:(类内函数指针数组)