C++代码报错‘abc is inaccessible’,友元函数为何无法访问私有成员?
问题分析与解决
你的代码报错的根源在于A类内部多余且错误的友元声明,我们一步步拆解:
错误原因
在A类的public区域,你写了这么一行:
friend void A::display(B&a);
这完全是画蛇添足,而且违反了C++友元的设计逻辑:
- 友元的作用是让外部实体(比如其他类的成员函数、全局函数)能够访问当前类的私有成员。但
A::display本身就是A类的成员函数,它天生就有权限访问A类的所有成员,根本不需要被声明为A类的友元。 - 更关键的是,这种声明会让编译器产生混淆——它会误以为你在声明一个外部函数作为A的友元,而不是指向A自己的成员函数。这直接导致B类中对
A::display的友元声明无法正确生效,最终在访问c.abc时,编译器判定这个成员函数没有足够的权限。
修复方案
只需要删掉A类中那行错误的友元声明即可,修正后的代码如下:
#include <iostream> using namespace std; class B; class A { int a = 10; int b = 20; public: void display(B & c); // 仅保留成员函数声明 }; class B { int abc = 20; public: friend void A::display(B&a); // 这里的友元声明是正确的,让A的display能访问B的私有成员 }; void A::display(B & c) { cout << c.abc; // 现在可以正常访问了 } int main() { B b; A a; a.display(b); return 0; }
这段代码编译运行后会输出20,符合预期。
额外提醒
- 友元关系是单向的:B声明A的display为友元,不代表A会自动允许B访问它的私有成员,反之亦然。
- 友元声明不需要匹配参数名,只需要匹配函数签名(返回类型、函数名、参数类型),所以B类里的
friend void A::display(B&a);和A类里的void display(B & c);是完全匹配的,参数名不影响友元关系的建立。
内容的提问来源于stack exchange,提问作者Aqleema Sajid
相关产品推荐
相关产品推荐

