如何在c++中指向全局函数中的成员函数
how to point to a member function in a global function in C++?
现在我正在用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
似乎不能在全局函数中指向成员函数,但我需要它。
glutDisplayFunc接受一个全局函数,所以,简单地说,你不能让它接受一个成员函数指针。
一种解决方案是将displayCube标记为静态,但这在一开始就破坏了拥有类的意义。
另一种选择是声明一个全局函数作为过剩显示回调,然后在该函数中,调用CSCommTestDlg对象的displayCube成员函数-如果您可以获得指向它的全局指针。
现在我正在写一个MFC程序与opengl在它。当我尝试将opengl与MFC结合在一起时。
如果您正在使用MFC或其他工具包,请不要使用GLUT! GLUT不是OpenGL的一部分,你不需要使用它。
,我让它指向一个成员函数displayCube,这似乎是非法的,我得到了一个错误,像这样:
自然。因为成员函数需要调用类实例。如果您查看生成的机器码,它看起来就像有一个指向类实例的指针作为第一个参数传递。所以你真正需要的是一个所谓的"闭包",一个c++不支持的特性。 可以用一些动态生成的代码技巧来模拟闭包。但是在您的情况下,这是不必要的。GLUT和其他工具包不能混用
- 内联函数中具有内部链接的全局变量
- 为什么虚函数不能是静态的和全局的?
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局作用域中函数指针的赋值
- 在命名空间中使用全局命名空间中的函数
- C++ 在编译时具有函数计算全局变量
- 在具有全局类型def的类中使用成员函数指针
- 修改程序的入口点时未调用全局变量的构造函数
- 从函数中全局删除并重新实例化数组结构,而无需在编译时知道数组的大小
- 尝试更改 main 函数内的全局变量值时出现编译错误 C++.
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- 全局函数参数
- std::线程不是全局变量,但在到达创建它的函数的末尾时不会超出范围?
- 初始化与函数输入相关的全局数组
- 删除全局隐式函数 - 避免使用不明确的运算符
- 如何在全局变量的构造函数之前运行函数
- 如何定义全局函数指针并分配给特定地址
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 在函数中用不同的名称引用全局向量
- 如何在一个结构体中为多个函数全局存储数据