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

时间:2017-07-03 22:23:42

标签: c++ windows

我需要将函数设置为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

那么设置回调的正确方法是什么?

2 个答案:

答案 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设计很糟糕。一部分。