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

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

C++中静态函数中非静态成员的更新,c++,opengl,glfw,C++,Opengl,Glfw,我正试图根据我在OpenGL中的鼠标移动来更新相机的参数。我正在使用GLFW。GLFW中有一个预定义的事件处理程序 glfwSetCursorPosCallback(window, mouseMoveCallback); 我用来注册mouseMoveCallback函数的。我已经在一个类中声明了我的相机,程序中使用了相机类的一个实例。Camera类中的成员是非静态的,但mouseMoveCallback函数是静态的。我知道静态函数不可能访问非静态成员。更新Camera类的非静态实例成员的最佳方

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

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


通过使用globals并使用mouseMoveCallback函数更新globals,然后从非静态成员函数读取更新的全局值,我能够获得所需的功能。但是,当我想添加更多的参数来读取时,这可能会很快变得很糟糕,比如键盘输入等。因此,我想知道是否有更好的方法来实现这一点

您的问题要求您决定使用哪种设计来与对象实例通信

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

另一个设计是查看回调是否允许用户参数。如果是,则可以将实例指针附加到用户参数。调用回调时,从用户参数检索实例


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

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

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

另一个设计是查看回调是否允许用户参数。如果是,则可以将实例指针附加到用户参数。调用回调时,从用户参数检索实例

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

您可以使用它将用户定义的指针与GLFWwindow对象关联起来。假设您有一个win指向的GLFW窗口和一个cam指向的摄影机对象-设置为:

...
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:
    ...
}
可以使用将用户定义的指针与GLFWwindow对象关联。假设您有一个win指向的GLFW窗口和一个cam指向的摄影机对象-设置为:

...
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:
    ...
}

那么,要更新的摄影机对象在哪里?这不是一个类的问题-你已经在某处实例化了一个对象,这个对象有你想要更新的成员。您基本上需要设计一种获取对象的方法,不管它是以全局、单例模式存储,Camera对象在另一个类的函数中实例化,我还设置了回调函数和静态函数mouseMoveCallback我可以通过使用全局函数和mouseMoveCallback函数来更新全局函数,然后从中读取更新的全局值,从而获得所需的功能非静态成员函数。但是,当我想添加更多的参数来读取时,这可能会很快变得很糟糕,比如键盘输入等。因此,我想知道是否有更好的方法来执行此操作。那么,要更新的摄影机对象在哪里?这不是一个类的问题-你已经在某处实例化了一个对象,这个对象有你想要更新的成员。您基本上需要设计一种获取对象的方法,不管它是以全局、单例模式存储,Camera对象在另一个类的函数中实例化,我还设置了回调函数和静态函数mouseMoveCallback我可以通过使用全局函数和mouseMoveCallback函数来更新全局函数,然后从中读取更新的全局值,从而获得所需的功能非静态成员函数。但是当我想添加更多的参数来读取时,比如键盘输入等,这会很快变得很糟糕。所以我想知道是否有更好的方法来实现这一点我只想添加GLFW通过函数提供用户参数,所以它直接支持使用第二种方法。我想补充一点,GLFW通过函数提供用户参数,所以它直接支持使用第二种方法 H