関数ポインタとコールバック

私は、Microsoft Visual Studio 2010とOpenCV
2.3.0ライブラリを使用して、画像処理用のアプリケーションを作成しています。

私には間違ったコードがあり、それを修正する方法がわかりません。私は、2つまたは3つのウィンドウが同時に開いているアプリケーションを実装しています。それぞれのウィンドウに異なる
CvMouseCallback 関数を割り当てることができます。私は、これらのすべての
CvMouseCallback
関数が、ユーザが選択したものに従って、これらの関数のいずれかへのポインタを返す別の関数と共に、別のクラスに存在するようにします。

私の Window.h には、このコードが含まれています。

class Window
{
public:
   ...//constructors and destructors
   void setMouseHandler( CvMouseCallback mouseHandler );
private:
   ...//other stuff
};

and Window.cpp

#include "stdafx.h"

void Window::setMouseHandler( CvMouseCallback mouseHandler )
{
    cvSetMouseCallback( win, mouseHandler, NULL );
}

今、 MouseHandler.h ファイル

class MouseHandler
{
public:
   ...
   CvMouseCallback selectHandler( int option );
   void __cdecl selectROI( int event, int x, int y, int flags, void *param );

private:
   Image *in;
   Window *win;
   void ( CV_CDECL MouseHandler::*callback )( int event, int x, int y, int flags, void *param );
};

最後に、含まれている MouseHandler.cpp

void __cdecl MouseHandler::selectROI( int event, int x, int y, int flags, void *param )
{
   //do something
}

CvMouseCallback MouseHandler::selectHandler( int option )
{
   callback = (MouseHandler::selectROI);
   return callback;
}

あなたが必要とするかもしれない情報の最後のビットは、OpenCVライブラリからのCvMouseCallbackの定義です。

typedef void (CV_CDECL *CvMouseCallback )(int event, int x, int y, int flags, void* param);

問題は次のとおりです。MouseHandler.cppの最後の関数からコールバックを返すと、下線が引かれ、エラーが表示されます。

エラー:戻り値の型が関数の型と一致しません。

私は、それが要求しているオブジェクトのように見えないものを返すために、その関数に強制しようとしているということがわかっています。しかし、それは単なる機能であり、私がメインクラスでそれを行うことができれば、それは大丈夫だろう。私の問題は、selectROI関数へのポインタをselectHandlerが返すことで、別のクラスで使用できるようにすることです。

ベストアンサー

selectROI()メソッドは静的ではないため、最初の引数として暗黙の
this パラメータが必要です。それを静的にしようとすると、実際にC APIに渡す場合は、実際に
extern "C"
を渡す必要がありますが、完全に適切かつ移植可能なすべての機能ポインタ。これは次のような簡単な転送機能です。

extern "C" void selectROI( int event, int x, int y, int flags, void *param );

次に、C ++クラスのメソッドを静的でなく(クラスメンバー変数にアクセスできるように)する場合は、
cvSetMouseCallback()の3番目の引数としてMouseHandlerオブジェクトへのポインタを渡すだけで済みます。あなたはあなたのコールバックでそれを受け取るでしょう、そして、これは次のように見えます:

extern "C" void selectROI( int event, int x, int y, int flags, void *param )
{
    static_cast(param)->selectROI( event, x, y, flags);
}

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です