You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:37:35