已声明为友元的类成员函数为何无法访问对应类的私有成员?
C++友元访问问题解答
1. printer函数是否可以访问B类私有成员?
只要符合C++语法规则,A::printer完全有权限访问B类的私有成员,你设计的友元逻辑本身没有问题,只是写法不符合语言的声明顺序要求。
2. 报错的核心原因
- 类可见性顺序错误:C++编译器是从上到下逐行解析代码的,你在定义A类的
printer函数实现时,B类还没有被声明,编译器此时根本不知道B是什么类型,更不可能知晓后续B会声明A::printer为友元,直接判定访问私有成员非法。 - 友元生效时机滞后:友元声明写在B类内部,只有编译器处理完B类的友元声明后,
A::printer的访问权限才会生效。你把printer的实现放在友元声明之前,权限还未生效自然编译不通过。 - 额外语法错误:你给出的代码片段中,两个类定义结束后都没有加英文分号
;,这本身就是C++的语法错误,也会触发编译失败。
3. 正确实现示例
// 1. 前向声明B类,告知编译器B是一个存在的类类型 class B; // 2. 定义A类,仅声明printer成员函数,暂不实现 class A{ public: void printer(); }; // 3. 定义B类,声明A::printer为友元,此时A类已完整定义,可识别A::printer class B{ friend void A::printer(); private: int private_data; }; // 4. 最后实现A::printer,此时B类已完整定义、友元关系已生效,访问合法 void A::printer(){ B obj; obj.private_data = 10; // 不会再报不可访问错误 }
内容的提问来源于stack exchange,提问作者g0x0
相关产品推荐
相关产品推荐

