3
class gfx { 
    void resize(int x, int y);
}

gfx g;    

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

4

2 回答 2

6

gfx::resize是类型void(gfx::*)(int, int)。您无法将其有意义地转换为 typevoid(*)(int, int)因为您只能将其作为 type 对象的成员函数调用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 中找到它们)。

于 2010-12-27T23:54:04.850 回答
0

是的,你可以这样做:

void easy_resize(int x, int y) { g.resize(x, y); }
于 2010-12-28T00:15:02.883 回答