繁体   English   中英

提供一种方法作为回调函数(gcc 4.7.1)

[英]Giving a method as a callback function (gcc 4.7.1)

我试图将一个看似简单的回调方法指针设置为一个变量,并得到以下错误:

CSerialSniffer.cpp | 11 |错误:无法从类型'Nexus :: TReceiveCallback(CSerialSniffer ::)(Nexus :: CData *,Nexus :: IMetaData *)'}'转换'CSerialSniffer :: AsyncRecieverReceived' 键入“ 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);
}

而且编译良好。 两者有什么区别?

您的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>标头中。

您的回调声明

typeAsyncReceiverCallback

是常规函数,但是

AsyncReceiverReceived

是一种方法(即,它需要“ this”指针,并且无法在c ++中以这种方式获取它)。

可以将AsyncReceiverReceived更改为静态,也可以使用观察者模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM