使用成员函数指针

使用成员函数指针

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
}

使用成员函数指针

上一篇:QT-Mac: Undefined symbols for architecture x86_64


下一篇:Zip文件中文乱码问题解决方法(MAC->Windows)