如何设置对类的私有函数的函数回调?
How to set a function callback to a private function of a class?
我需要将函数设置为API提供的函数的回调。现在 API 提供了一个示例,允许我编写此代码并且它可以工作: 在头文件中:
#include <iostream>
int __stdcall newDataAvailable(SampleStruct datum);
class Interface:
public:
Interface();
// Connects to the local server. Returns false if it fails.
bool connectToServer();
private:
};
在实现中,我有:
Interface::Interface()
{
iV_SetSampleCallback(newDataAvailable);
}
bool Interface::connectToServer(){
// code to connect to server
}
int __stdcall newDataAvailable(SampleStruct datum){
std::cout << "New DATA" << std::endl;
return 0;
}
所以,到目前为止一切顺利。现在,当我想使函数newDataAvailable成为类的一部分时,问题就来了。所以我将标头复制到类声明的私有区域,在 imempmetation cpp 文件中添加一个接口::并尝试 agai。
但是我不知道如何建立连接,因为它无法编译。这是我尝试过的:
iV_SetSampleCallback(&newDataAvailable); // Gives me illegal & operation
iV_SetSampleCallback(Interface::newDataAvailable); // error: C3867: 'Interface::newDataAvailable': non-standard syntax; use '&' to create a pointer to member
iV_SetSampleCallback(&Interface::newDataAvailable); // error: C2664: 'int iV_SetSampleCallback(pDLLSetSample)': cannot convert argument 1 from 'int (__stdcall Interface::* )(SampleStruct)' to 'pDLLSetSample'
iV_SetSampleCallback(newDataAvailable); // error: C3867: 'Interface::newDataAvailable': non-standard syntax; use '&' to create a pointer to member
那么设置回调的正确方法是什么?
此消息:
iV_SetSampleCallback(&Interface::newDataAvailable); // error: C2664: 'int iV_SetSampleCallback(pDLLSetSample)': cannot convert argument 1 from 'int (__stdcall Interface::* )(SampleStruct)' to 'pDLLSetSample'
说类型错误。事实上,语法是"正确的",你只是没有做你认为你在做的事情。您实际所做的是传递指向成员函数的指针,该成员函数使用Interface*
作为this
类型,但 API 需要指向函数(未绑定到特定对象实例(的指针,这就是您收到类型错误的原因。
请注意,您的类型会弹出以下问题:回调宏 (QT( 如果您也是这种情况,看起来您将不得不使用全局变量(可能装扮成单例(,因为"他们"部分的 API 设计很差。
您可以通过将函数声明为静态来添加newDataAvailable
函数具有类的一部分。将该函数声明为静态后,您可以将其用作回调函数的一部分。不确定这是否是你的意图。
相关文章:
- 以特征类型作为参数的泛型函数回调
- C# DllImport 调用非托管C++函数回调
- 为什么模板参数推导失败,std::函数回调的可变参数模板参数?
- std::包含 std::函数回调的多个包装器的向量不起作用
- 如何设置对类的私有函数的函数回调?
- 如何使用 c++11 函数回调声明多个模板参数
- sqlite3 更改函数回调参数 void* not用于 int* C++
- 如何知道 sqlite 中的函数"回调"是否返回了一些东西?
- Windows表单如何使用其他函数回调图表信息
- 如何在 c++ 结构中的 void* 变量中调用存储函数(回调)
- 将成员函数作为标准函数回调
- C++ 使用成员函数回调实现按钮
- std::函数回调,参数采用观察者模式(寄存器主题上的占位符)
- 使用可变参数模板从 Lua 函数回调 (C api) 中提取参数
- 在C++中使用派生类的静态方法作为函数回调
- 将libuv与函数结构一起使用,而不是函数回调
- 如何将函数回调传递给类成员
- c++类成员函数回调
- C++函数回调:无法从成员函数转换为函数签名
- 如何编写一个通用函数回调测试类