Обновление нестатических членов статической функции в C++

Я пытаюсь обновить параметры моей камеры на основе движения мыши в OpenGL. Я использую GLFW. В GLFW есть предопределенный обработчик событий.

glfwSetCursorPosCallback(window, mouseMoveCallback);

который я использую для регистрации функции mouseMoveCallback(). Я объявил свою камеру в классе, и в программе используется экземпляр класса камеры. Члены класса Camera не являются статическими, но функция mouseMoveCallback является статической. Я знаю, что статическая функция не может получить доступ к нестатическим членам. Как лучше всего обновить членов нестатического экземпляра класса Camera?

Я могу получить требуемую функциональность, используя глобальные переменные и функцию mouseMoveCallback() для обновления глобальных переменных, а затем считывая обновленные глобальные значения из нестатических функций-членов. Но это может очень быстро стать уродливым, когда я хочу добавить больше параметров для чтения, таких как ввод с клавиатуры и т. Д. Поэтому я хотел знать, есть ли лучший способ сделать это.


person shaveenk    schedule 21.04.2014    source источник
comment
Итак, где находится камера object, которую вы хотите обновить? Проблема не в class — вы где-то создали экземпляр объекта, и у этого объекта есть члены, которые вы хотите обновить. В основном вам нужно разработать способ доступа к объекту, независимо от того, сохраняет ли он его как глобальный, одноэлементный шаблон и т. д., а затем получает к нему доступ.   -  person PaulMcKenzie    schedule 21.04.2014
comment
объект камеры создается в функции (другого класса), где я также настраиваю обратный вызов и статическую функцию mouseMoveCallback()   -  person shaveenk    schedule 21.04.2014
comment
Я могу получить требуемую функциональность, используя глобальные переменные и функцию mouseMoveCallback() для обновления глобальных переменных, а затем считывая обновленные глобальные значения из нестатических функций-членов. Но это может очень быстро стать уродливым, когда я хочу добавить больше параметров для чтения, таких как ввод с клавиатуры и т. Д. Поэтому я хотел знать, есть ли лучший способ сделать это.   -  person shaveenk    schedule 21.04.2014


Ответы (2)


Для связывания пользовательского указателя с GLFWwindow объект. Допустим, вы создаете объект GLFWwindow, на который указывает win, и объект Camera на который указывает 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:
    ...
}
person Brett Hale    schedule 21.04.2014

Ваш вопрос требует, чтобы вы решили, какой дизайн использовать для связи с вашими экземплярами объектов.

Одним из вариантов может быть создание глобального std::map дескрипторов окон в качестве ключа и экземпляра объекта в качестве данных. Когда приходит дескриптор, вы ищете на карте дескриптор окна и оттуда можете получить экземпляр объекта.

Другой дизайн заключается в том, чтобы увидеть, допускает ли обратный вызов «пользовательский параметр». Если это так, то вы можете прикрепить указатель на экземпляр к пользовательскому параметру. Когда вызывается обратный вызов, вы извлекаете экземпляр из «параметра пользователя».

Это всего два метода. Есть и другие, которые я не буду упоминать, но их можно изучить, выполнив поиск способов «создания объектно-ориентированной оболочки для интерфейса 'C'».

person PaulMcKenzie    schedule 21.04.2014
comment
Я просто хотел бы добавить, что GLFW предлагает этот пользовательский параметр через glfwSetWindowUserPointer(), поэтому она напрямую поддерживает использование второго подхода. - person derhass; 21.04.2014