[英]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.