在我的班上,如果我想指向班级成员,
struct S
{
static int get();
int do_something();
int x;
};
我知道,
int (*p)() = S::get;
不幸的是,这不适用于非静态成员
int (*p)() = S::do_something; // error
因为,静态成员函数是一个普通的函数,从下面我引用的引用中可以看出非静态成员函数也是一个普通的函数,所以为什么它不起作用呢?这是什么意思?
(9.2 / 10)[注意:非静态成员函数的类型是普通的 函数类型,非静态数据成员的类型是普通的 对象类型。没有特殊的成员函数类型或数据成员 类型。 ]
答案 0 :(得分:5)
非静态成员函数是不是普通函数。你无法形成对它们的自由指示。
引用非静态成员函数的唯一允许方法是通过实例指针/引用的对和指向成员函数的指针:
S * p = &theobject;
int (S::*ptmf)() = &S::do_something;
return (p->*ptmf)();
与成员对象(你可以很好地形成一个自由指针,例如&theobject.x
)不同,成员函数更复杂,因为你需要考虑虚函数:If { {1}}是一个多态基类,S
是一个指向基类的指针,而p
是虚拟的,那么上面的例子应该执行正确的调度类型。一个简单的自由函数指针不能这样做。
(此外,该标准没有规定如何实现成员函数的每个底层实现,因此这个细节永远不会暴露给用户。通常它会像do_something()
那样,但那不是指定。)子>
答案 1 :(得分:2)
函数的类型是普通的,而不是函数指针的类型。必须像这样声明指向非静态成员函数的指针:
typedef int (S::*p)() ptr_to_member_of_s;
答案 2 :(得分:0)
int (S::*p)() = S::do_something;
非静态成员函数是一个普通的函数,除了它有一个不可见的参数。