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

在其他类定义的友元函数中访问类私有成员时出现编译错误

问题分析与解决

你的问题核心是:在cl1中定义setx函数时,cl2还只是前置声明,编译器不知道它的私有成员x的存在。前置声明只能告诉编译器“有这么个类”,但没法提供类的内部结构信息,所以直接在cl1里写obj->x会报错。

解决方法很简单:把setx的函数定义移到cl2的完整定义之后,这样编译器就能看到cl2的x成员了。

修正后的代码如下:

#include <iostream>
using namespace std;

class cl2; // 前置声明

class cl1 {
    int y;
public:
    cl1(int num) { y = num; }
    void setx(cl2 *obj, int num); // 只声明,不定义
};

class cl2 {
    int x;
public:
    cl2(int num) { x = num; }
    friend void cl1::setx(cl2 *obj, int num);
    int getx() { return x; }
};

// 现在cl2已经完整定义,可以访问它的私有成员x了
void cl1::setx(cl2 *obj, int num) {
    obj->x = num;
}

int main() {
    cl2 objcl2(2);
    cl1 objcl1(1);
    objcl1.setx(&objcl2, 20);

    cout << objcl2.getx() << "\n\n";

    system("pause");
    return 0;
}

另外注意代码里要加上#include <iostream>和using namespace std;,不然cout会编译报错,你原来的代码里漏了这部分。

内容的提问来源于stack exchange,提问作者Tobías Milano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 20:00:57