2013-09-27 4 views
0

Я хочу написать простой класс, который инициализирует openGL. Я решил создать метод run, где я инициализирую opengl, glutDisplayFunc, glutMainLoop. Я хочу передать начертить функцию к этому методу и использовать его в качестве параметра для glutDisplayFuncФункция pass как параметр к методу

void OpenGL::run(void(*drawFunction())) { 
    this->init(); 
    glutDisplayFunc(drawFunction); 
    glutMainLoop(); 
}; 

Но я получил ошибку argument of void type *(*)() is incompatible with parameter of type void (*)().

Не работает glutDisplayFunc(&drawFunction); и glutDisplayFunc(*drawFunction);. В чем проблема?

+2

ЬурейеЕ ничтожной (* callback_function) (ничтожной); void OpenGL :: run (callback_function param) – LukeCodeBaker

+0

Хуст подсказка: GLUT не работает с тем, чтобы быть инкапсулированным в классы. Если вы действительно хотите использовать класс для своей основной структуры приложения, вы должны написать несколько функций оболочки GLUT, которые пересылают обратные вызовы в основной объект приложения. Однако я настоятельно рекомендую вам пересмотреть подход «класс приложения». По определению в данной программе может быть только один экземпляр приложения. Это означает, что этот класс приложения всегда будет использоваться как (если это было) singleton. Синглтоны, однако, считаются анти-шаблонами для многих людей http://goo.gl/zU43IF - так зачем их использовать? – datenwolf

ответ

5

Вы неуместны закрывающую скобку:

void OpenGL::run(void (*drawFunction)()) { 

указатели на функции, то действовать, как и любые другие указатели, вы просто передавать их по значению. Вы уже делаете, что правильно: glutDisplayFunc(drawFunction);

Документация glutDisplayFunc также показывают прототип обратного вызова: http://www.opengl.org/resources/libraries/glut/spec3/node46.html

+0

и для 'glutDisplayFunc' будет' glutDisplayFunc (drawFunction); 'или' glutDisplayFunc (* drawFunction); '? – lapots

+1

'glutDisplayFunc (drawFunction);' Так же, как в вашем вопросе. – Adam

+0

, и если ваша функция является другой, добавьте __closure перед * – Spektre

Смежные вопросы