如何在 C++ 中指向全局函数中的成员函数?

Posted

技术标签:

【中文标题】如何在 C++ 中指向全局函数中的成员函数?【英文标题】:how to point to a member function in a global function in C++? 【发布时间】:2011-12-19 08:52:45 【问题描述】:

现在我正在编写一个带有 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

似乎我不能指向全局函数中的成员函数,但我需要它。如何解决?

【问题讨论】:

mem_fn 怎么样? 我个人会使用 glut 以外的库,或者创建一个包含一堆静态函数(回调)的框架,该框架拥有某种游戏对象,该对象具有与这些回调匹配的函数调用。所以是一种过剩和你的游戏之间的接口。 (我猜我假设你在写游戏哈哈) @JoachimPileborg:这对提问者有什么帮助? 【参考方案1】:

glutDisplayFunc 接受一个全局函数,所以,简单地说,你不能让它接受一个成员函数指针。

一种解决方案是将 displayCube 标记为静态,但这有点破坏了首先拥有一个类的意义。

另一种选择是将全局函数声明为 glut 显示回调,然后在该函数内部调用 CSCommTestDlg 对象的 displayCube 成员函数 - 如果您可以获得指向它的全局指针。

【讨论】:

【参考方案2】:

现在我正在编写一个带有 opengl 的 MFC 程序。当我尝试将 opengl 与 MFC 结合使用时。

如果您使用 MFC 或其他工具包,请不要使用 GLUT! GLUT 不是 OpenGL 的一部分,您不需要使用它。

我让它指向一个成员函数 displayCube,这似乎是非法的,我得到了这样的错误:

当然。因为成员函数需要调用类实例。如果您查看生成的机器代码,它看起来并没有什么不同,就好像有一个指向作为第一个参数传递的类实例的指针。所以你真正需要的是一个所谓的“闭包”,一个特性只是C++不支持。

可以使用一些动态生成的代码技巧来模拟闭包。但是在您的情况下,这不是必需的。 GLUT 和其他工具包不能混合使用。

【讨论】:

以上是关于如何在 C++ 中指向全局函数中的成员函数?的主要内容,如果未能解决你的问题,请参考以下文章

C++函数指针与成员函数指针

多线程设计,保护C++中的全局成员

c++ 全局静态函数的理解

C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值

C++ 怎么定义一个全局函数,能够在一个工程的所有文件中使用!

C++对象实例成员函数内存表示