创建成员函数指针数组遇错误,寻求解决方案
成员函数指针数组初始化错误的解决方法
问题根源
你遇到的错误是因为非静态成员函数指针的语法和普通函数指针完全不同,直接写meleeAttack这类成员函数名的方式不符合C++对成员函数指针的初始化要求,编译器无法将其识别为有效的函数指示符。
正确实现方式
假设Human类的三个私有成员函数签名均为void()(若实际有参数,只需对应修改指针类型即可),在Human.cpp中的正确实现步骤如下:
- 先定义成员函数指针的类型别名(简化代码书写):
// 在Human.cpp的合适位置(如action函数外或内部)定义 using HumanAction = void (Human::*)();
- 在
action函数中初始化数组时,必须显式取成员函数的地址,并带上类作用域:
void Human::action() { // 正确初始化成员函数指针数组 HumanAction actions[] = { &Human::meleeAttack, &Human::rangedAttack, &Human::intimidatingShout }; // 调用示例:执行数组中的第一个成员函数 (this->*actions[0])(); }
关键细节说明
- 非静态成员函数必须绑定类对象才能调用,因此指针类型必须包含类名:
返回值 (类名::*)(参数列表),这是C++语法的强制要求。 - 取成员函数地址时必须用
&类名::函数名,不能省略&和类作用域,否则编译器无法区分普通函数与成员函数,进而抛出你看到的错误。 - 调用成员函数指针时,必须使用
(对象指针->*指针)或(对象.*指针)的语法,括号不能省略——这是因为成员访问运算符的优先级高于函数调用运算符。
内容的提问来源于stack exchange,提问作者agile_flow
相关产品推荐
相关产品推荐

