1.
使用 classname::*的形式声明一个指向成员函数的指针。
eg.
/ / pmf 是一个指针, 它可以指向 Screen 的某个常量成员函数
/ / 前提是该函数不接受任何实参, 并且返回一个 char
auto pmf = &Screen::get_cursor;
- 指向成员函数的指针也需要指定目标函数的返回类型和形参列表
- 如果成员函数是 const 成员 或者引用成员, 则我们必须将 const 限定符或引用限定符包含进来。
如果成员存在重载的问题, 则我们必须显式地声明函数类型以明确指出我们想要使用的是哪个函数
char (Screen::*pmf2) (Screen::pos, Screen::pos ) const;
pmf 2 = &Screen::get;
括号不能少,否则编译为
/ / 错误: 非成员函数 p 不能使用 const 限定符
char Screen::*p (Screen::pos, Screen::pos ) const;
在成员函数和指向该成员的指针之间不存在自动转换规则:
/ / pmf 指向一个 Screen 成员 , 该成员不接受任何实参且返回类型是 char
pmf = &Screen::get;/ / 必须显式地使用取地址运算符
pmf = Screen::get;/ / 错误: 在成员函数和指针之间不存在自动转换规则
2. 使用成员函数指针
.*或者->*运算符作用于指向成员函数的指针, 以调用类的成员函数:
Screen myScreen, *pScreen = &myScreen;
char c1 = (pScreen->*pmf) ( );
char c2 = (myScreen.*pmf2 ) ( 0, 0 ) ;
2.1 使用成员指针的类型别名
/ / Action 是一种可以指向 Screen 成员函数的指针, 它接受两个 pos 实参, 返回一个 char
using Action = char (Screen::* ) (Screen::pos, Screen::pos ) const;
Action get = &Screen::get; / / get 指向 Screen 的 get 成员
可以将指向成员函数的指针作为某个函数的返回类型或形参类型。 其中, 指向成员的指针形参也可以拥有默认实参:
Screen& action(Screen&, Action = &Screen::get);
Screen myScreen;
action(myScreen);
action(myScreen, get);
action(myScreen, &Screen::get);
2.2 成员指针函数表
常见的用法是将其存入一个函数表当中
class Screen {
public:
Screen& home();
Screen& froward();
Screen& back();
Screen& up();
Screen& down();
}
->
class Screen {
public:
using Action = Screen& (Screen::*)();
enum Directions { HOME, FORWARD, BACK, UP, DOWN };
Screen& move(Directions);
private:
static Action Menu[];
};
Screen& Screen::move(Directions cm)
{
return (this->*Menu[cm])();
}
Screen::Action Screen::Menu[] = {
&Screen::home,
&Screen::forward,
&Screen::back,
&Screen::up,
&Screen::down,
};
Screen myScreen;
myScreen.move(Screen::HOME);
myScreen.move(Screen::DOWN);
|