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

为什么我的C++代码中私有数据成员a、b无法正常访问?

问题原因
  • 友元函数签名不匹配:你在x、y两个类中声明为友元的add函数参数顺序为(x, y),但你后续实际定义add函数时把参数顺序写反为(y o1, x o2)。C++中函数参数的类型顺序是函数签名的组成部分,参数顺序不同就属于完全不同的函数,因此你实际写的这个add并没有获取到两个类的友元权限,自然无法访问私有成员a和b。
  • 函数调用参数不匹配:main函数中调用add时传入的参数是x类型的obj1在前、y类型的obj2在后,和你自己定义的add的参数顺序也不匹配,也会触发编译报错。
修复方案

统一add函数的声明、定义、调用三个环节的参数顺序即可,示例修正代码如下:

#include <iostream>
using namespace std;
class x;
class y
{
    int a;

public:
    void setdata(int val)
    {
        a = val;
    }
    friend void add(x, y);
};
class x
{
    int b;

public:
    void setdata(int val)
    {
        b = val;
    }
    friend void add(x, y);
};
// 参数顺序和友元声明保持一致:x在前,y在后
void add(x o1, y o2)
{
    cout << "the sum is: " << o1.b + o2.a;
}
int main()
{
    x obj1;
    obj1.setdata(4);

    y obj2;
    obj2.setdata(9);
    // 传参顺序和函数定义保持一致
    add(obj1, obj2);
}

修正后代码运行输出为:the sum is: 13。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:54:01