2016-06-22 31 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