1

重複の可能性:
クラスメンバー関数をコールバックとして渡すにはどうすればよいですか?

私は2つのクラスAとBを持っています

class A
{
public:
   void SetHandler(void (*p)(OMX_BUFFERHEADERTYPE*)){ Handler = p; };
private:
  void (*Handler)(OMX_BUFFERHEADERTYPE*);
}

BIには機能があります

void B::handler(OMX_BUFFERHEADERTYPE* p){};

今(Bから)私が電話するとき

inst_a.SetHandler(&B::handler);

次のエラーが表示されます。

B.cpp:740:69: error: no matching function for call to ‘A::SetHandler(void (COMXVideo::*)(OMX_BUFFERHEADERTYPE*))’
B.cpp:740:69: note: candidate is:
A.h:161:8: note: void A::SetHandler(void (*)(OMX_BUFFERHEADERTYPE*))
A.h:161:8: note:   no known conversion for argument 1 from ‘void (B::*)(OMX_BUFFERHEADERTYPE*)’ to ‘void (*)(OMX_BUFFERHEADERTYPE*)’

私は何を間違っていますか?

よろしくお願いします

4

2 に答える 2

3

&B::handlerは関数ポインターではなく、メンバー関数へのポインターです。B::handlerのメンバーが必要ない場合はB、定義できますstatic。その後、SetHandler(&B::handler)動作します。

メンバー関数へのポインターが必要な場合は、次のように定義できます。

void (B::*Handler)(OMX_BUFFERHEADERTYPE*);

このようなメンバー関数を呼び出すときは、オブジェクトへのポインターも必要です

(inst_b->*Handler)(omxbuffer);

または参照付き

(inst_b.*Handler)(omxbuffer);
于 2012-12-26T22:43:06.200 に答える
0

次のようなことを試してください:

template<typename C>
class EventObject
{

    public:
        typedef void (C::*FunctionType)();

        template <typename ... T>
        EventObject(C& obj,FunctionType methode): obj (obj), callback (methode) {};

       void execute(){obj.*callback();};

    private:
        C& obj;
        FunctionType callback;
};
于 2012-12-26T23:26:27.127 に答える