您对静态UI类采用了错误的方法。从静态回调“反弹”到实例函数的通常方法是将能够进行跳转的内容存储在可从静态回调访问的位置。
大多数需要这类静态回调的API,例如GLFW和本机Win32,都提供了一种进行上述关联的方法。GLFW窗口具有指针大小的存储块,您可以将其分配给:用户指针。您可以根据需要获取或设置此用户指针。
一个非常常见的模式是拥有某种类,Game
该类具有诸如“ HandleKeyPress(Key key)” 之类的方法。程序启动时,创建Game
对象并进行所有GLFW初始化,然后将Game
指针填充到用户数据存储中:
int main () {
GLFWindow * window = ... create GLFW window ...
Game game(... game constructor parameters ...);
glfwSetWindowUserPointer(window, &game);
... main game loop ...
}
然后,您的键盘回调(以及所有其他静态回调)可以Game *
从用户指针存储中解压缩并转发给它:
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
Game * game = reinterpret_cast<Game *>(glfwGetWindowUserPointer(window);
game->HandleKeyDown(...);
}
在HandleKeyDown
对方法Game
的实例可以在需要沿转发给你的UI对象(或者,如果你真的只需要键盘输入的UI对象,你可以只是把这些东西一个指向用户存储你的用户界面对象,然而,馅有点像游戏或更高级别的东西通常更好,因为每个窗口只能使用一个指针)。