0

一見単純なコールバックメソッドポインタを変数に設定しようとすると、次のエラーが発生します。

CSerialSniffer.cpp | 11 |エラー:'CSerialSniffer::AsyncRecieverReceived'をタイプ'Nexus:: TReceiveCallback(CSerialSniffer ::)(Nexus :: CData *、Nexus :: IMetaData *)'}'|から変換できません 'Nexus :: typeAsyncReceiverCallback {aka Nexus :: TReceiveCallback()(Nexus :: CData、Nexus :: IMetaData *)}'|と入力します。

setステートメントは次のとおりです。

typeAsyncReceiverCallback l_pPointer = AsyncRecieverReceived;

そして、私は次のように定義しています:

typedef TReceiveCallback (*typeAsyncReceiverCallback)(CData *a_pData, IMetaData *a_pMetaData);

class CSerialSniffer
{
...
public:
    Nexus::TReceiveCallback AsyncRecieverReceived(Nexus::CData *a_pData, Nexus::IMetaData *a_pMetaData);
...
}

私はこれに何時間もいます、何かアイデアはありますか?

回答への回答: 私はここに同じコールバックメカニズムを持っています:

typedef void (*EnqueueCallback)( PData *pd );

class SomeClass
{
...
public:
   void enqueue( PData *pd );
...
};


class CSerialSniffer
{
...
public:
    void set_enqueue_callback(EnqueueCallback a_pEnqueueCallback );
...
}


SomeClass::SomeFunction(){
 this->serialSniffer->set_enqueue_callback(this->enqueue);
}

そしてそれはうまくコンパイルされます。2つの違いは何ですか?

4

2 に答える 2

3

あなたCSerialSniffer::AsyncRecieverReceivedはメンバー関数です。オブジェクトなしでは使用できないため、(クラス外の)フリー関数または静的関数のいずれかにします。

class CSerialSniffer
{
...
public:
    static Nexus::TReceiveCallback AsyncRecieverReceived(
         Nexus::CData *a_pData, 
         Nexus::IMetaData *a_pMetaData);
...
};

typeAsyncReceiverCallback l_pPointer = &CSerialSniffer::AsyncRecieverReceived;

C ++ 11のより良い代替手段は、std::function<>代わりに次を使用することです。

typedef std::function<TReceiveCallback(CData*,IMetaData*)> 
        typeAsyncReceiverCallback;

これで、メンバー関数の最初の引数としてオブジェクトをバインドすることにより、フリー関数を作成できます。

CSerialSniffer snivver;

auto callback = std::bind( 
     std::mem_fun( &CSerialSniffer::AsyncRecieverReceived ),
     &snivver );

これらのグッズは、<functional>ヘッダーにあります。

于 2012-08-23T13:55:30.953 に答える
2

コールバック宣言

typeAsyncReceiverCallback

通常の機能ですが、

AsyncReceiverReceived

はメソッドです(つまり、「this」ポインタが必要であり、C ++でこの方法で取得する方法はありません)。

staticに変更AsyncReceiverReceivedするか、オブザーバーパターンを使用します。

于 2012-08-23T13:55:32.247 に答える