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

为何无法在类B中使用类Foo的成员函数指针?

问题分析与修复方案

核心错误点

  • “最令人头疼的解析”陷阱:B类中Foo obj();是声明了一个返回Foo类型的无参成员函数,而非定义Foo类型的成员变量。
  • 成员指针访问错误:ptrToFunc是Foo类的成员变量,必须通过Foo对象(obj)访问,直接写ptrToFunc会被视为未声明标识符。
  • 指针调用语法错误:成员函数指针的调用必须遵循(对象.*成员函数指针)()的语法,需明确通过对象获取指针,并通过括号保证运算符优先级。

修复后的完整代码

class Foo
{
public:
    double (Foo::*ptrToFunc)();

private:
    double func1() { return 1.0; } // 补充函数实现,避免链接报错
    double func2() { return 2.0; }

public:
    Foo() : ptrToFunc{&Foo::func1} {}
}; // 补充类定义结束的分号

class B
{
public:
    Foo obj; // 修正为成员变量定义,而非函数声明
    double countVal()
    {
        // 正确调用:通过obj访问ptrToFunc,再按成员函数指针语法调用
        return (obj.*obj.ptrToFunc)();
    }
}; // 补充类定义结束的分号

int main()
{
    B obj_B;
    double var = obj_B.countVal();
    return 0;
}

关键细节说明

  • 修正成员变量声明:将Foo obj();改为Foo obj;,避免编译器误解析为函数声明。
  • 指针访问方式:必须通过obj.ptrToFunc获取Foo对象中的成员函数指针,不能直接使用ptrToFunc。
  • 运算符优先级:.*的优先级低于(),因此必须用括号包裹obj.*obj.ptrToFunc,确保先完成指针绑定再执行函数调用。
  • 函数实现补充:原代码中func1和func2只有声明无实现,会导致链接阶段报错,因此补充了简单的返回值实现。

内容的提问来源于stack exchange,提问作者Vadim Shestak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:25:21