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);
});