由“类的成员函数”充当“回调函数”引发的问题的思考和解决方案

我今天编写了一个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);

 

 

posted @ 2011-02-10 19:45  aicro  阅读(307)  评论(0编辑  收藏  举报