Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将函数回调设置为类的私有函数?_C++_Windows - Fatal编程技术网

C++ 如何将函数回调设置为类的私有函数?

C++ 如何将函数回调设置为类的私有函数?,c++,windows,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

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


};
那么,设置回调的正确方法是什么呢?

您可以通过将newDataAvailable函数声明为static来添加其类的一部分。一旦该函数被声明为静态,那么您就可以将其用作回调函数的一部分。不确定这是否是你的意图

此消息:

iV_SetSampleCallback(&Interface::newDataAvailable); // error: C2664: 'int iV_SetSampleCallback(pDLLSetSample)': cannot convert argument 1 from 'int (__stdcall Interface::* )(SampleStruct)' to 'pDLLSetSample'
说类型不对。实际上,语法是“正确的”,你只是没有做你认为你在做的事情。实际上,您要做的是传递一个指向使用接口*作为此类型的成员函数的指针,但API希望指向未绑定到特定对象实例的函数的指针,这就是为什么会出现类型错误

请注意,您的类型会出现以下问题:
如果你也是这样的话,看起来你将不得不使用一个全局变量,因为“他们”的API设计太差,所以可能会被装扮成一个单例。

那么真正的代码是什么样子呢?那个标题显然不是真正的代码。我相信你的函数必须有“接口”类型的参数……你做到了吗?哪里你在这里展示的东西不完整……我不明白你的话。这是真正的代码。最后四次尝试只是替换构造函数中的行,您可以考虑使用一个单例类设计,它将类的实例存储在一个成员中。在这些情况下,您可以使用类的静态成员函数并将其设置为回调。对其使用static会破坏将其作为成员函数的目的。谢谢!!好像以前有人问过我同样的问题!!但是,如果不使用静态函数,我似乎无法做我想做的事情。这太糟糕了。@aarelovich您在某个地方被一个自由函数或静态方法卡住了,但是如果您只有一个接口实例,那么如果您在某个地方有一个可用的单个实例引用,静态方法可以转过来调用私有方法。如果你有不止一个例子,你就有问题了。是的,我想。我看看我能做什么
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'