我需要将函数设置为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成为类的一部分。所以我将标题复制到类声明的私有区域,在实现cpp文件中添加一个Interface ::并尝试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
那么设置回调的正确方法是什么?
答案 0 :(得分:1)
您可以通过将newDataAvailable
函数声明为静态来添加https://graph.facebook.com/v2.9/575805779234615/videos?access_token=<my token>&fields=videos.fields(id,length)
https://graph.facebook.com/v2.9/575805779234615/videos?access_token=<my token>&fields=videos{id,length}
https://graph.facebook.com/v2.9/575805779234615/videos?access_token=<my token>&fields=data{id,length}
https://graph.facebook.com/v2.9/575805779234615/videos?access_token=<my token>&fields=posts{id,length}
函数。一旦该函数被声明为静态,那么您可以将其用作回调函数的一部分。不确定这是不是你的意图。
答案 1 :(得分:1)
此消息:
iV_SetSampleCallback(&Interface::newDataAvailable); // error: C2664: 'int iV_SetSampleCallback(pDLLSetSample)': cannot convert argument 1 from 'int (__stdcall Interface::* )(SampleStruct)' to 'pDLLSetSample'
说类型错了。事实上,语法是正确的,你只是没有做你认为自己在做的事情。你实际做的是传递指向成员函数的指针,该成员函数使用Interface*
作为this
类型,但是API需要指向函数的指针(未绑定到特定对象实例),这就是为什么你改为输入类型错误。
请注意,您的类型会显示此问题:CALLBACK macro (QT) 如果您也是如此,看起来您将不得不使用全局变量(可能打扮成单身人士),因为他们的&#39;他们的API设计很糟糕。一部分。