在C ++中更新静态函数中的非静态成员

时间:2014-04-21 00:16:09

标签: c++ opengl glfw

我正在尝试根据我在OpenGL中的鼠标移动来更新相机的参数。我正在使用GLFW。 GLFW中有一个预定义的事件处理程序

glfwSetCursorPosCallback(window, mouseMoveCallback);

我正在使用注册mouseMoveCallback()函数。我在一个类中声明了我的Camera,并且在程序中使用了Camera类的实例。 Camera类中的成员是非静态的,但mouseMoveCallback函数是静态的。我知道静态函数不可能访问非静态成员。我可以更新Camera的非静态实例的成员的最佳方法是什么?

我可以通过使用全局变量并使用mouseMoveCallback()函数来更新全局变量,然后从非静态成员函数中读取更新的全局值,从而获得所需的功能。但是当我想添加更多参数来读取时,如键盘输入等,这可能会变得非常难看。所以我想知道是否有更好的方法来做到这一点

2 个答案:

答案 0 :(得分:3)

您可以使用glfwSet/GetWindowUserPointer将用户定义的指针与GLFWwindow对象相关联。假设GLFWwindow指向win Cameracam指向... glfwSetWindowUserPointer(win, cam); glfwSetCursorPosCallback(win, mouseMoveCallback); ... 对象 - 设置为:

mouseMoveCallback

由于从C库调用extern "C" void mouseMoveCallback (GLFWwindow *win, double x, double y) { // get the associated user-data: Camera *cam = static_cast<Camera *>(glfwGetWindowUserPointer(win)); // manipulate the associated Camera object: ... } ,因此它具有C链接:

{{1}}

答案 1 :(得分:2)

您的问题需要您决定使用哪种设计与对象实例进行通信。

一种设计可能是创建一个窗口句柄的全局std :: map作为键和对象实例作为数据。当句柄进入时,您在地图中搜索窗口句柄,然后可以从那里检索对象实例。

另一种设计是查看回调是否允许“用户参数”。如果是这样,那么您可以将指向实例的指针附加到用户参数。调用回调时,从“user parameter”中检索实例。

这只是两种方法。还有一些我不会提及,但可以通过搜索“为'C'界面制作面向对象的包装器”来研究。

相关问题