Как указать на функцию-член в глобальной функции в C ++? - PullRequest
2 голосов
/ 19 декабря 2011

Теперь я пишу программу MFC с opengl. И когда я попытался объединить OpenGL с MFC, я столкнулся с некоторыми проблемами: Сначала я определил класс с именем: CSCommTestDlg и определил функцию-член с кодами следующим образом:

void CSCommTestDlg::OpglMain(int argc, char* argv[])
{
    glutDisplayFunc(displayCude);
}

displayCube также является функцией-членом класса CSCommTestDlg, а glutDisplayFunc является глобальной функцией (функция opengl), объявления функций glutDisplayFunc выглядят следующим образом:

GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void));

Да, как вы можете видеть, параметр glutDisplayFunc является указателем на функцию, и я сделал так, чтобы он указывал на функцию-член displayCube , которая кажется недопустимой, и я получил такую ​​ошибку:

error C2664: 'glutDisplayFunc' : cannot convert parameter 1 from 'void (void)' to 'void (__cdecl *)(void)'
    None of the functions with this name in scope match the target type

кажется, что я не могу указать на функцию-член в глобальной функции, но она мне нужна. Как это исправить?

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

glutDisplayFunc принимает глобальную функцию, поэтому, проще говоря, вы не можете заставить ее взять указатель на функцию-член.

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

Другим вариантом было бы объявить глобальную функцию в качестве обратного вызова дисплея, а затем внутри этой функции вызвать функцию-член displayCube вашего объекта CSCommTestDlg - если вы можете получить глобальный указатель на него.

1 голос
/ 19 декабря 2011

Теперь я пишу программу MFC с opengl. И когда я попытался объединить OpenGL с MFC.

Если вы используете MFC или другой инструментарий, не используйте GLUT! GLUT не является частью OpenGL, и вам не нужно его использовать.

и я указал на функцию-член displayCube, которая кажется недопустимой, и я получил такую ​​ошибку:

Естественно. потому что функция-член требует, чтобы экземпляр класса был вызван с. Если вы посмотрите на сгенерированный машинный код, он будет выглядеть не так, как если бы был указатель на экземпляр класса, переданный в качестве первого параметра. Так что вам действительно нужно было так называемое «замыкание», функция , просто , не поддерживаемая C ++.

Можно эмулировать замыкания с помощью некоторой динамически сгенерированной хитрости кода. Но в вашем случае это не обязательно. GLUT и другие наборы инструментов не смешиваются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...