为什么我的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
相关产品推荐
相关产品推荐

