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

C++友元函数无法访问类私有成员问题求助

解决友元函数仍无法访问私有成员的问题

嘿,我看到你的问题了——你已经把TWO类的print函数声明为ONE类的友元,但编译器还是提示私有数据成员不可访问对吧?其实问题不在友元声明本身,而是两个容易被忽略的基础细节:

问题根源

  • 缺少<iostream>头文件:cout是C++标准输入输出库的对象,必须包含<iostream>头文件才能使用它,否则编译器无法识别这个符号。
  • 未指定std命名空间:cout属于std命名空间,直接写cout编译器找不到它,要么给它加上std::前缀,要么通过using namespace std;导入命名空间。

修正后的完整代码

#include <iostream>  // 必须包含这个头文件才能用cout

class ONE;
class TWO {
public:
    void print(ONE& x);
};
class ONE {
private:
    int a, b;
public:
    friend void TWO::print(ONE& x);
    ONE() : a(1), b(2) { }
};

void TWO::print(ONE& x) {
    std::cout << "a is " << x.a << std::endl;  // 使用std::前缀
    std::cout << "b is " << x.b << std::endl;
}

int main() {
    ONE xobj;
    TWO yobj;
    yobj.print(xobj);
    return 0;
}

或者如果你不想每次都写std::,可以在头文件后面加上using namespace std;(注意:这种方式在小型示例中没问题,但在大型项目中不推荐,避免命名冲突):

#include <iostream>
using namespace std;  // 导入std命名空间

class ONE;
class TWO {
public:
    void print(ONE& x);
};
class ONE {
private:
    int a, b;
public:
    friend void TWO::print(ONE& x);
    ONE() : a(1), b(2) { }
};

void TWO::print(ONE& x) {
    cout << "a is " << x.a << endl;
    cout << "b is " << x.b << endl;
}

int main() {
    ONE xobj;
    TWO yobj;
    yobj.print(xobj);
    return 0;
}

验证结果

修正后的代码编译运行后,会输出:

a is 1
b is 2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:43:55