使用成员函数指针
Author: David Kieras
原文地址 Using Pointers to Member Functions
翻译 Uttep
成员函数指针不像普通的函数指针,因为成员函数有一个“隐藏的this pointer”,以至于仅仅只能提供一个对象来充当this的作用,使用特殊的syntax来告诉compiler设定这个隐藏的this形参。
1. 声明一个成员函数指针
你可以像声明函数指针的方式来声明一个成员函数指针,就是语法有一点不一样。想是成员函数的verbose form,你用class name修饰(qualify) 指针,使用就像是scope qualifier和pointer的结合。
声明一个函数指针:
return_type (*pointer_name)(int ii);
声明一个成员函数指针:
size_t (class_name::*pointer_name)(int ii);
//::*是合法的。
2. 设置一个成员函数指针
你设置一个成员函数指针变量通过赋值一个class-qualified函数名字,就像普通的函数指针一样。
//函数指针变量的赋值
pointer_name = function_name;
pointer_name = &function_name;
//成员函数指针变量
pointer_name = &class_name::member_function_name;
3. 使用成员函数指针变量来调用函数
成员函数指针变量需要使用特殊的语法来调用其所指成员函数。这个语法就像是访问一个指针所指对象成员或者对象指针。
原文如下不知翻译是否准确。
The syntax looks like you are preceding the dereferenced pointer with an object member selection (the “dot” operator) or object pointer selection (the “arrow” operator).
//使用一个函数指针变量调用函数
result = pointer_name(arguments);
//or
result = (*pointer_name)(arguments);
//成员函数指针变量调用
result = (object.*pointer_name)(arguments);
//使用指向对象的指针调用
result = (object_ptr->*pointer_name)(arguments);
4. 一个成员函数里使用一个指向成员的指针(pointer to member)调用另外成员函数
这看上去有点困惑。实际上,这就是指向成员指针的用途。
class A {
void f();
void g();
};
void A::f()
{
// declare pmf as pointer to A member function,
// taking no args and returning void
void (A::*pmf)();
// set pmf to point to A‘s member function g
pmf = &A::g;
// call the member function pointed to by pmf points on this object
(this->*pmf)(); // calls A::g on this object
}
// using a typedef to preserve sanity - same as above with typedef
// A_pmf_t is a pointer-to-member-function of class A
typedef void (A::*A_pmf_t)();
void A::f()
{
A_pmf_t p = &A::g;
(this->*p)(); // calls A::g on this object
}