如何在main中调用Ghost类数组对象内的成员函数指针数组?
如何调用Ghost类中成员函数指针数组的方法
嘿,我来帮你解决这个成员函数指针调用的问题!首先得先揪出你代码里的几个关键问题,不然连编译都过不了,更别说调用了:
- 你在Ghost类里把成员函数指针数组的变量定义成了
Func func;,这完全错了!因为你要存的是一个数组,所以类型应该是Func* func;,不然new Func[5]返回的指针根本没法赋值给它 - 构造函数里写了
func[1] = &Ghost::random;,但你的类里根本没有random函数,对应的是running_random,名字写错啦 - 你分配了5个元素的数组,但只给0、1、2、4索引赋值,索引3是空的,后续调用容易踩野指针,最好给它赋值
nullptr - 还有内存泄漏的问题,构造函数里
new的数组没在析构函数里delete,得补上
接下来就是正确的调用语法了,成员函数指针的调用必须和对象绑定,而且因为运算符优先级的问题,括号一定不能少!针对你的场景,ph[0]是栈上的对象(不是指针),正确的调用格式是:
(ph[0].*(ph[0].func[0]))();
如果你觉得这个写法有点绕,可以拆分一下,让代码更清晰:
// 先取出ph[0]的函数指针数组 Func* funcArray = ph[0].func; // 取出要调用的那个成员函数指针 Func targetFunc = funcArray[0]; // 调用函数 (ph[0].*targetFunc)();
要是你用的是指针形式的Ghost对象,比如Ghost* p = &ph[0];,那调用方式就改成:
(p->*(p->func[0]))();
最后给你贴个完整的修正版代码,你可以直接参考:
class Ghost; typedef void(Ghost::* Func)(); class Ghost { public: Func* func; // 修正类型为指针,用来存数组 public: void init() {}; void running_random() {}; void running_afraid() {}; void dead() {}; Ghost(){ func = new Func[5]; func[0] = &Ghost::init; func[1] = &Ghost::running_random; // 修正函数名 func[2] = &Ghost::running_afraid; func[3] = nullptr; // 给空索引赋值,避免野指针 func[4] = &Ghost::dead; } ~Ghost(){ delete[] func; // 释放内存,避免泄漏 } }; int main() { Ghost ph[4]; // 调用第一个Ghost对象的init函数 (ph[0].*(ph[0].func[0]))(); // 调用第一个Ghost对象的running_random函数 Func* funcArr = ph[0].func; (ph[0].*funcArr[1])(); return 0; }
核心要点再强调一遍:
- 成员函数指针数组的变量类型必须是
Func*,不是Func - 调用时必须通过具体对象访问那个指针数组,不能直接写
func - 一定要用
(对象.*成员函数指针)()的格式,括号是必须的,不然编译器会解析错优先级
内容的提问来源于stack exchange,提问作者Izacc
相关产品推荐
相关产品推荐

