Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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++_Callback_Static Members - Fatal编程技术网

C++ 使用成员函数作为回调函数

C++ 使用成员函数作为回调函数,c++,callback,static-members,C++,Callback,Static Members,我想使用成员函数作为回调(使用): 我知道这是不可能的,因为我需要一个MyClass的实例来调用方法mouseButtonChanged 但是我能做什么呢?您需要传入这种类型的函数指针: void (*)(GLFWindow*, double, double) 不幸的是,他们似乎没有给你一个任何上下文争论的位置。因此,一种方法是全局回调方法: struct MyCallback { static MyClass* obj; static void callback(GLFWi

我想使用成员函数作为回调(使用):

我知道这是不可能的,因为我需要一个
MyClass
的实例来调用方法
mouseButtonChanged


但是我能做什么呢?

您需要传入这种类型的函数指针:

void (*)(GLFWindow*, double, double)
不幸的是,他们似乎没有给你一个任何上下文争论的位置。因此,一种方法是全局回调方法:

struct MyCallback {
    static MyClass* obj;

    static void callback(GLFWindow* window, double a, double b) {
        obj->mouseButtonChanged(window, double a, double b);
    }
};
要像这样使用:

MyCallback::obj = &myObj;
glfwSetCursorPosCallback(window, &MyCallback::callback);
这是因为
callback
现在不需要实例。不幸的是,现在我们有了一个全局的
MyClass*
。不过我们还是有点受不了。我们不能在这里使用
std::bind()
表达式或lambda,因为任何带有捕获的东西都不能转换为函数指针

[更新]由于您可以在
窗口中添加
void*
,因此您也可以执行以下操作:

glfwSetWindowUserPointer(window, &myObj);
glfwSetCursorPosCallback(window, +[](GLFWindow* win, double a, double b){
    static_cast<MyClass*>(glfwGetWindowUserPointer(win))->mouseButtonChanged(win, a, b);
});
glfwSetWindowUserPointer(窗口和myObj);
glfwSetCursorPosCallback(窗口,+[](GLFWindow*win,双a,双b){
静态转换(glfwGetWindowUserPointer(win))->鼠标按钮更改(win,a,b);
});

其中,
operator+
在没有捕获的lambda上(例如本例中的lambda)将其转换为原始函数指针

> P>您可以使用<代码> GLFWSETWOWWORUSEPOUNCTION/CONDE>来附加管理窗口的C++类。之后,您可以编写一个静态函数转发到“WindowManager”的成员函数

2.16——我如何使用C++方法作为回调?< /P> 不能将常规方法用作回调,因为GLFW是一个C库 不知道对象和指针。如果你愿意 接收到C++对象的回调,使用静态方法或规则 函数作为回调函数,存储指向要调用的对象的指针 作为窗口的用户指针调用,并使用它调用 你的目标


在该函数中没有为用户数据指针提供机制,这有点令人震惊。可能需要一个包含GLWindow*到对象的映射的回调可以访问的静态映射。如果需求是可调用的(支持函数
operator()
),我建议使用
std::bind
解决方案,但我认为它在您的情况下不起作用。谢谢,但我没有c++11支持。如果您不使用
std::bind
,则不需要c++11支持,不管您是否支持C++11,正如我前面提到的,它都不会对您起作用因为我在main.cpp(包括MyClass.h)中创建了我的实例;因此,我不知道如何在MyClass.cpp.@arthur.sw中访问它。如果您从
MyClass
中添加回调,那么您只需要
MyCallback::obj=this
glfwSetWindowUserPointer(window, &myObj);
glfwSetCursorPosCallback(window, +[](GLFWindow* win, double a, double b){
    static_cast<MyClass*>(glfwGetWindowUserPointer(win))->mouseButtonChanged(win, a, b);
});