2016-06-22 108 views
0

所以我开始开发一个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

这是与C库回调机制接口的常用模式。回调用指向用户数据的指针(在这种情况下是对象指针)注册 –

+0

我知道回调函数是什么,它是如何工作的。我想问的是他们使用static_cast param的原因。这是否会创建新类并替换已存在的类? – Windforces

回答

3

你可以从cv::setOpenGlDrawCallback

documentation的签名是看到:

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(); 
    } 
} 

铸造空隙的指针,param转换为foo类型的对象。它基本上获得了当你将它作为void指针传递时被铸造的this的语义。

+0

感谢您的回答。很好的解释! – Windforces