Я много осматривался и много читал о статических функциях и переменных, я понял, что нельзя просто вызывать нестатическую переменную / функцию в статической функции и т. Д., Поэтому мой вопрос заключается в том, как мне решить эту проблему. Я имею с GLFW key_callback.
В GLFW у нас есть это:
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}
и мы добавляем это как другие вызовы, связанные с окном:
glfwMakeContextCurrent(window);
glfwSetKeyCallback(window, window_key_callback);
Но теперь я хочу иметь возможность вызывать другую функцию класса, если в key_callback нажата клавиша «пробел» следующим образом:
в .h файле у меня есть
#include "A.h"
...
private:
A *anotherClass;
и в файле .cpp у меня в конструкторе
anotherClass = new A();
и остальное
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (key == GLFW_KEY_SPACE && action == GLFW_PRESS)
antoherClass->draw();
}
и этот anotherClass не является статичным, я просто хочу начать рисовать, если пробел нажат.
Может кто-то помочь мне с этим?
Вам нужно сделать antherClass
глобальная переменная, другого пути нет. Обычно функция обратного вызова должна принимать указатель данных, предоставленный пользователем, чтобы разрешить передачу внешней информации, похоже, здесь есть недостаток API.
Редактировать: Оказывается, вы можете использовать glfwSetWindowUserPointer а также glfwGetWindowUserPointer сделать это.
Как указал Ингум, вы можете использовать glfwSetWindowUserPointer а также glfwGetWindowUserPointer иметь доступ к указателю void * по вашему выбору.
Вот простой пример для тех, кто проходит как я:
int main(void)
{
t_MyDatas datas;
GLFWwindow *window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);
//[...]
glfwSetWindowUserPointer(window, (void *)&datas);
glfwSetKeyCallback(window, &KeyCallback);
}
void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
t_MyDatas *datas;
datas = (t_MyDatas *)glfwGetWindowUserPointer(window);
//[...]
}
Важно помнить, что приведение из (void *) затем приведение к исходной структуре.