获取函数 ptr 到实例类的成员函数?

Posted

技术标签:

【中文标题】获取函数 ptr 到实例类的成员函数?【英文标题】:get function ptr to member function of instanced class? 【发布时间】:2010-12-27 23:52:35 【问题描述】:
class gfx  
    void resize(int x, int y);


gfx g;    

我能以某种方式将 g.resize 转换为 'void (*)(int, int)' 吗?

【问题讨论】:

如果你解释你想要做什么,也许我们可以建议一些可行的替代方案。 将 GLFW 中的调整大小回调包装到我的图形类中 【参考方案1】:

没有。 gfx::resize 的类型为 void(gfx::*)(int, int)。您无法将其有意义地转换为 void(*)(int, int) 类型,因为您只能将其作为 gfx 类型的对象的成员函数来调用。

成员函数只能在类的实例上调用,所以给定你的gfx g;,你可以调用g.resize(),但你不能像普通函数一样调用resize()。普通函数指针不能指向成员函数,因为它无法将函数调用绑定到类的实例。

从概念上讲,成员函数接受一个附加参数,this 参数,它指向调用它的类的实例。

如果您希望能够通过普通函数指针调用成员函数,您可以创建一个带有参数的非成员函数(或静态成员函数)包装器,您可以将对象实例传递给调用成员函数。例如,您可以:

void resize(gfx* obj, int x, int y) 
    return obj->resize(x, y);

这个非成员resize 函数的类型为void(*)(gfx*, int, int),可以作为非成员函数调用。这种方法的通用形式是 C++0x 中的 std::functionstd::bind 工具(您也可以在 Boost 和 C++ TR1 中找到它们)。

【讨论】:

void(*)(int, int) 没有 this 指针。您必须指定要针对哪个类型/实例运行它,因此签名也必须更改。 @Merlyn:这不是我说的吗? 是的。过去,我没有得到那个“成员函数”带有一个“this”指针。我花了一些时间阅读了关于 this 的明确教程,我才理解了这一点。顺便说一句,我确实投了赞成票。 @Merlyn:啊;谢谢你。我有时很难“像初学者一样”思考,您指出这一点很有帮助。【参考方案2】:

是的,你可以做到:

void easy_resize(int x, int y)  g.resize(x, y); 

【讨论】:

这就是我目前的做法。但我必须跟踪指向我的图形类的指针,这似乎有点 hacky 你需要图形类做什么?有必要把它变成一个类吗?有时只拥有函数(不是类的成员函数)是一个不错的选择。

以上是关于获取函数 ptr 到实例类的成员函数?的主要内容,如果未能解决你的问题,请参考以下文章

我将如何存储类的成员函数?

将成员函数 ptr 插入地图

C函数中如何调用未实例化类的成员函数

可以使用类的成员函数更改对象的实例吗?

指向实例的成员函数而不是类的指针

C++中怎么获取类的成员函数的函数指针