如何设置对类的私有函数的函数回调?

How to set a function callback to a private function of a class?

本文关键字:函数 回调 何设置 设置      更新时间:2023-10-16

我需要将函数设置为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函数具有类的一部分。将该函数声明为静态后,您可以将其用作回调函数的一部分。不确定这是否是你的意图。