在C++中更新静态函数中的非静态成员
Updating non-static members in a static function in C++
我正试图根据OpenGL中的鼠标移动来更新相机的参数。我正在使用GLFW。GLFW 中有一个预定义的事件处理程序
glfwSetCursorPosCallback(window, mouseMoveCallback);
用于注册mouseMoveCallback()函数。我已经在一个类中声明了我的Camera,程序中使用了Camera类的一个实例。Camera类中的成员是非静态的,但mouseMoveCallback函数是静态的。我知道静态函数不可能访问非静态成员。更新Camera类的非静态实例的成员的最佳方式是什么?
我可以通过使用全局变量并使用mouseMoveCallback()函数更新全局变量,然后从非静态成员函数中读取更新后的全局值来获得所需的功能。但当我想添加更多的参数来读取时,比如键盘输入等,这可能会变得非常糟糕。所以我想知道是否有更好的方法来完成
您可以使用glfwSet/GetWindowUserPointer将用户定义的指针与GLFWwindow
对象相关联。假设您创建了一个由win
指向的GLFWwindow
,以及一个由cam
指向的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:
...
}
您的问题要求您决定使用哪种设计来与对象实例通信。
一种设计可以是创建窗口句柄的全局std::映射作为键,对象实例作为数据。当句柄出现时,您可以在地图上搜索窗口句柄,然后可以从中检索对象实例。
另一种设计是查看回调是否允许"用户参数"。如果是,则可以将指向实例的指针附加到用户参数。调用回调时,您可以从"用户参数"中检索实例。
这只是两种方法。还有一些我不会提及,但可以通过搜索"为‘C’接口制作面向对象的包装器"的方法来进行研究。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何在C++中使用非静态成员函数作为回调函数
- (C++)为什么静态成员可以在初始化之前使用
- 类的全局对象和静态成员
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 模板化类中静态成员的延迟初始化
- 使用静态成员声明类时遇到问题
- C++:是否可以使用非静态成员变量模板?
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 如何在复杂继承中访问静态成员变量
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- C++构造函数和静态成员
- 为什么传递非静态成员函数会导致编译错误?
- 非静态成员失败的线程调用函数
- 静态成员变量不会由 gettext 转换
- decltype:使用指针访问类的静态成员
- 更新函数调用中的静态成员会导致崩溃
- 静态成员未被更新
- 在C++中更新静态函数中的非静态成员