Передача функций-членов в glut или любую другую библиотеку достаточно проста.GLUT ищет указатель на функцию.
Пусть Controller будет классом с функцией-членом OnKeyPress, которую мы хотим отправить в glutKeyboardFunc.Сначала вы можете попробовать что-то вроде
glutKeyboardFunc(&Controller::OnKeyPress);
Здесь мы передаем указатель на функцию, однако это неверно, так как вы хотите отправить функцию-член этого объекта класса.В C ++ 11 вы можете использовать новый std :: bind , или, если вы используете более старый компилятор, я бы порекомендовал boost :: bind .В любом случае синтаксис примерно одинаков.
using namespace std::placeholders; // for the _1, _2 placeholders
glutKeyboardFunc(std::bind(&Controller::OnKeyPress, &GLInput, _1, _2, _3));
Из документации видно, что glutKeyboardFunc требует 3 параметра.Сначала мы фиксируем адрес памяти первого аргумента вашего объекта, поскольку он является функцией-членом, а затем предоставляем 3 заполнителя.
Для новичков в std :: bind это кажется странным, но для всех, кто делал объектно-ориентированный код на C, это очевидно.Функция на самом деле является просто функцией C и нуждается в указателе this для класса.Связывание не было бы необходимым, если бы обратный вызов был простой функцией.