在我的类(class)里,如果我想指向类(class)的成员,
struct S
{
static int get();
int do_something();
int x;
};
我愿意,
int (*p)() = S::get;
不幸的是,这不适用于非静态成员
int (*p)() = S::do_something; // error
因为静态成员函数是一个普通函数,而且从我在下面引用的引文中可以看出,非静态成员函数也是一个普通函数,那么为什么它不起作用呢?这是什么意思?
(9.2/10) [Note: the type of a nonstatic member function is an ordinary function type, and the type of a nonstatic data member is an ordinary object type. There are no special member function types or data member types. ]
最佳答案
非静态成员函数不是普通函数。您不能形成指向它们的自由指针。
引用非静态成员函数的唯一允许方式是通过一对实例指针/引用和指向成员函数的指针:
S * p = &theobject;
int (S::*ptmf)() = &S::do_something;
return (p->*ptmf)();
不像成员对象(你可以很好地形成一个自由指针,例如&theobject.x
),成员函数更复杂,因为你需要考虑虚函数:如果 S
是一个多态基类并且 p
是一个指向基的指针并且 do_something()
是虚函数,那么上面example 应该执行正确类型的调度。一个简单的自由函数指针无法做到这一点。
(此外,该标准没有指定成员函数的每个底层实现是如何实现的,所以这个细节永远不会暴露给用户。通常它会像 int S_mangled_name_do_something(S *) ;
,但未指定。)
关于c++ - 指向类成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8277944/