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

标签 c++ opengl glfw

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

glfwSetCursorPosCallback(window, mouseMoveCallback);

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

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

最佳答案

您可以使用 glfwSet/GetWindowUserPointer将用户定义的指针与 GLFWwindow 对象相关联。比方说你create win 指向的 GLFWwindowcam 指向的 Camera 对象 - 设置为:

...
glfwSetWindowUserPointer(win, cam);
glfwSetCursorPosCallback(win, mouseMoveCallback);
...

由于 mouseMoveCallback 是从 C 库调用的,因此它具有 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++ - 在 C++ 中更新静态函数中的非静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23189056/

相关文章:

如果目标进程未打开,C++获取进程ID获取本地ID

c - GLFW3 : warning: implicit declaration of function ‘glGenBuffers’

c++ - ostream 和 basic_ostream<unsigned char> 有什么区别?

c++ - 如何使用递归创建四叉树复制构造函数

c++ - Phong 着色器中不需要的透明度 - GLSL

linux - 与 Linux 上的 GLUT 共享上下文

c++ - 超出窗口的 opengl 菜单是如何实现的?

c++ - 什么时候可以安全使用 `isalpha()`

c++ - 如何改进我的代码以生成安全的随机数?

opengl - 使用现代 OpenGL 绘制圆点