2012-03-17 11:10:37|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, Visual Studio|来源:唯设编程网
函数指针是通过指向函数的指针间接调用函数。函数指针可以实现对参数类型、参数顺序、返回值都相同的函数进行封装,是多态的一种实现方式。由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样。本文通过位图图像处理类的实例,详细介绍了VC成员函数指针的具体使用方法,包括成员函数指针的类型申明,调用以及注意事项,读者看完本文便可以轻松使用成员函数指针实现事件序列的委托调用。
class CTestApplicationDlg : public CDialog { private: typedef void (__thiscall CTestApplicationDlg::*pImgProcessFun)(void); vector<pImgProcessFun> imgProFun; //图像处理函数容器 //灰度化 void grayProcess(); //二值化 void extremeProcess(); //反相 void reverseProcess(); //切边 void cutBlankProcess(); // 取第一行 void getFirstLineProcess(); // 自动色阶 void autoGradationProcess(); // ...... }
请注意,typedef为成员函数指针定义别名时的格式:
typedef void (__thiscall CTestApplicationDlg::*pImgProcessFun)(void);
需要在类型名前面增加作用域限定符“__thiscall CTestApplicationDlg::”。
void CTestApplicationDlg::OnBnClickedButton1() { imgProFun.clear(); //自动色阶 if(((CButton*)GetDlgItem(IDC_CHECK7))->GetCheck()) imgProFun.push_back(&CTestApplicationDlg::autoGradationProcess); //灰度化 if(((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck()) imgProFun.push_back(&CTestApplicationDlg::grayProcess); //反相 if(((CButton*)GetDlgItem(IDC_CHECK3))->GetCheck()) imgProFun.push_back(&CTestApplicationDlg::reverseProcess); //二值化 if(((CButton*)GetDlgItem(IDC_CHECK2))->GetCheck()) imgProFun.push_back(&CTestApplicationDlg::extremeProcess); //裁剪空白区域 if(((CButton*)GetDlgItem(IDC_CHECK5))->GetCheck()) imgProFun.push_back(&CTestApplicationDlg::cutBlankProcess); //裁剪首行区域 if(((CButton*)GetDlgItem(IDC_CHECK6))->GetCheck()) imgProFun.push_back(&CTestApplicationDlg::getFirstLineProcess); //重新建立对象 if(pImgUtility!=NULL){ delete pImgUtility; pImgUtility=NULL; } pImgUtility=new CImageUtility(CImageUtility::CopyBitmap((HBITMAP)(*hbmp))); this->Invalidate(); }
该方法获取对话框中的用户选项,根据用户选项定制图像处理函数序列,读者需要注意的是获取成员函数指针的方法:“&CTestApplicationDlg::reverseProcess”,不要忘记了在方法名称前面增加类作用域限定符”CTestApplicationDlg::“。
void CTestApplicationDlg::OnPaint() { if (IsIconic()) { //...... } else { CDialog::OnPaint(); //在STATIC控件中显示位图 if(hbmp!=NULL){ ////显示原始图片 ShowSrcBmp(); //执行处理函数 for(vector<pImgProcessFun>::size_type ix=0;ix!=imgProFun.size();ix++) (this->*(imgProFun[ix]))(); //显示处理后的图片 ShowDesBmp(); } } }
读者需要注意调用成员函数指针的格式
(this->*(imgProFun[ix]))();
本文总结了声明、定义成员函数指针以及对应的容器,向容器中增加成员函数指针,最后说明了调用成员函数指针的具体方法。