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

もしdocumentation署名

cv::setOpenGlDrawCallbackのから見ることができるようである:

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

OpenGLDrawCallbackタイプvoid (void* arg)の関数ポインタである:argはそれに渡す任意のポインタ型です。この場合、OpenCVは実際にuserdataを渡します。 thisが暗黙のうちに、それがvoid*(ポインタのコピー)を変換し、userdataが保有渡し、あなたのコードではHow do function pointers in C work?(C++にまだ適用)

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

を参照してください。そしてcallbackがあなたのフレームに描画するために呼び出されます

私が知る必要があるのは、静的キャストが発生する部分です。 は何をしていますか?なぜコードを実装する人がそれをこのように書くのですか?

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

鋳造型fooのオブジェクトにボイドポインタ、paramを変換します。基本的には、voidポインタとして渡したときにキャストされたthisのセマンティクスを取り戻します。

+0

答えをありがとう。説明されている! – Windforces

関連する問題