现在我正在编写一个带有opengl的MFC程序。当我尝试将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
似乎我不能指向全局函数中的成员函数,但我需要它。如何解决?
答案 0 :(得分:2)
glutDisplayFunc采用全局函数,因此,简单地说,你不能使它成为一个成员函数指针。
一种解决方案是将displayCube标记为静态,但这样就破坏了首先拥有一个类的重点。
另一种选择是将全局函数声明为过剩显示回调,然后在该函数内部调用CSCommTestDlg对象的displayCube成员函数 - 如果你可以获得一个指向它的全局指针。
答案 1 :(得分:1)
现在我正在编写一个带有opengl的MFC程序。当我试图将opengl与MFC结合起来时。
如果您使用的是MFC或其他工具包,请不要使用GLUT! GLUT不是OpenGL的一部分,您也不需要使用它。
并且我指向一个成员函数displayCube,这看起来是非法的,我得到了这样的错误:
自然。因为成员函数需要调用类实例。如果你查看生成的机器代码,它看起来就像是有一个指向作为第一个参数传递的类实例的指针。所以你真正需要的是一个所谓的“闭包”,一个功能只是不受C ++支持。
可以使用一些动态生成的代码技巧来模拟闭包。但在你的情况下这不是必要的。 GLUT和其他工具包不混合。