所以我开始开发一个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!!
}
您不必在此解释所有代码。我需要知道的是静态铸造发生的部分。它有什么作用?为什么实现代码的人会这样写呢?
答案 0 :(得分:3)
正如您从documentation
的cv::setOpenGlDrawCallback
所看到的那样
签名是:
void cv::setOpenGlDrawCallback(const String& winname,
OpenGlDrawCallback onOpenGlDraw,
void* userdata = 0
)
OpenGLDrawCallback
是void (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>