我有一个数据源的C API。为了通知新数据可用,您以函数指针的形式给API提供了回调。数据输入时,将调用您的回调。API的标头包含以下行:
struct DataRecord { ... };
typedef void (*DataCallback)(DataRecord *data);
void set_data_callback(DataCallback processor);
我的C ++类有一个带有签名的实例方法
void MyClass::process_data(DataRecord *data);
在MyClass的构造函数中,我想将新实例的process_data
方法设置为C API的数据回调。按照此答案,我尝试在构造函数中编写以下代码:
typedef void (MyClass::data_callback_t)(DataRecord*);
data_callback_t callback = &MyClass::process_data;
set_data_callback(callback);
当我这样做时,我得到了错误
错误C2664:“ set_data_callback”:无法将参数2从“ data_callback_t”转换为“ DataCallback”
没有可以进行这种转换的环境
(我希望使用Visual C ++ 2010 Express,尽管我希望这不会有所作为。)
如何从实例和方法中提取C函数指针?
你不能 MyClass::process_data
可以认为是void(MyClass*, DataRecord*)
,这是错误的类型。您必须以某种方式将类指针包装到调用中。
一种方法可能是引入带有静态指针的类型:
struct MyClassCallbackHelper
{
static MyClass* myClass;
static void callback(DataRecord* record) {
myClass->process_data(record);
}
};
这样您就可以:
MyClassCallbackHelper::myClass = this;
set_data_callback(&MyClassCallbackHelper::callback);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句