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

C++友元类调用成员函数指针编译失败问题求助

问题分析与解决办法

错误原因

classB的Compute方法里直接使用cp是错误的:cp是classA的私有成员变量,它属于classA的实例a,必须通过a来访问这个成员。直接写cp时,编译器会认为这是classB的成员或全局变量,找不到对应标识符就会抛出编译错误。

解决办法

修改Compute方法,通过a.cp获取成员函数指针后再调用:

class classB {
public:
   void Compute(int x, int y) { 
       (a.*(a.cp))(x, y); 
   }
private:
    classA a;
};

如果追求可读性,可以先把成员指针赋值给局部变量:

class classB {
public:
   void Compute(int x, int y) { 
       classA::ComputeMethod method = a.cp;
       (a.*method)(x, y); 
   }
private:
    classA a;
};

完整修正代码

class classA {
public:
    classA() { 
        // 补充condition的初始化示例
        bool condition = true;
        if (condition) { cp = &classA::Add; }
        else { cp = &classA::Mul; }
    }
private:
    typedef int (classA::*ComputeMethod)(int x, int y);
    int Add(int x, int y) { return x+y; }
    int Mul(int x, int y) { return x*y; }
    ComputeMethod cp;
    friend class classB;
};

class classB {
public:
   void Compute(int x, int y) { 
       (a.*(a.cp))(x, y); 
   }
private:
    classA a;
};

注:原代码中condition未初始化,实际编译时也会报错,建议补充初始化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:32:06