由“类的成员函数”充当“回调函数”引发的问题的思考和解决方案
我今天编写了一个opencv的程序。主要是把camshift算法包装成一个类,使用起来方便。然而,却遇到了如下的一个问题
void CTest::funA()
{
cvSetMouseCallback( "CamShift Adjust Window", &CTest::func, NULL);
// cvSetMouseCallback函数的原型是
// void cvSetMouseCallback( const char* window_name, CvMouseCallback, void* param=NULL );
}
但是这样一下,却出现了如下的编译错误
error C2664: 'cvSetMouseCallback' : cannot convert parameter 2 from 'bool (__thiscall CTest::* )(int, int, int, int, void*)' to 'CvMouseCallback'
这个问题我上网找了很久,终于在台湾的msdn中找到了几乎一模一样的问题。但是页面上没有解决。于是,我在仔细看了网友的评论之后,发现有一个解决方案,虽然不是最好的(主要破坏了封装性),但是也还是可用的。
解决方法。
1. 使用一个局部函数,它的原型需符合回调函数的原型。
void on_mouse( int state, int x, int y, int flags, void* param)
{
CTest *pHelper = (CTest*)param;
// 以后凡是要取得CTest的成员的时候,就得使用pHelper指针,这里也就是破坏封装性的情况
}
2. 注册回调函数的函数的param参数需要填写this指针
void CTest::funA()
{
cvSetMouseCallback( "CamShift Adjust Window", on_mouse, this);
}
------------------------------------------------------------------------
email : aicrosoft1104@126.com
吃遍天下。