这个回调函数有什么作用?

时间:2016-06-22 12:42:59

标签: c++ opencv

所以我开始开发一个OpenCV程序,问题是我不知道这段代码在整个上下文中做了什么。下面是整个代码的抽象版本。

class foo{
private:
    friend void callBack(void *param);
    void draw(void);
public:
    void func(void);
    void update(void);
}

void callBack(void *param){
    foo *context = static_cast<foo*>(param);
    if(context){
        context->draw();
    }
}

foo::foo(std::string windowName){
    cv::namedWindow(windowName, frameSize.width, frameSize.height);
    cv::resizeWindow(windowName, frameSize.width, frameSize.height);
    cv::setOpenGlContext(windowName);
    cv::setOpenGlDrawCallback(windowName, callBack, this);
}

void foo::func(void){
    cv::updateWindow(m_windowName);
}

void draw(void){
    //implementation shows here!!
}

您不必在此解释所有代码。我需要知道的是静态铸造发生的部分。它有什么作用?为什么实现代码的人会这样写呢?

1 个答案:

答案 0 :(得分:3)

正如您从documentation

cv::setOpenGlDrawCallback所看到的那样

签名是:

void cv::setOpenGlDrawCallback(const String& winname,
                               OpenGlDrawCallback onOpenGlDraw,
                               void* userdata = 0 
                              )

OpenGLDrawCallbackvoid (void* arg)类型的函数指针:其中arg是您传递给它的任何指针类型。在这种情况下,OpenCV实际上将userdata传递给它。请参阅How do function pointers in C work? (仍适用于C ++)

cv::setOpenGlDrawCallback(windowName, callBack, this);

在您的代码中,将this隐式转换的(指针的副本)传递给void*并由userdata保留。并且callback被调用来绘制你的框架

  

我需要知道的是静态铸造发生的部分。是什么   它呢?为什么实现代码的人会这样写呢?

void callBack(void *param){
    foo *context = static_cast<foo*>(param);
    if(context){
        context->draw();
    }
}

转换将void指针param转换为foo类型的对象。它基本上取回了this的语义,当你将它作为void指针传递时,它被转换为。{/ p>