为什么我不能访问ostream& operator<<(ostream& out, const Box& B){cout << B.l << " " << B.b << " " << B.h << endl; }
中Box
类的私有函数?
#include<bits/stdc++.h>
using namespace std;
class Box{
int l, b, h;
public:
Box(){
l=0;
b=0;
h=0;
}
Box(int length, int breadth, int height){
l=length;
b=breadth;
h=height;
}
bool operator < (Box &B){
if(l < B.l)return 1;
else if(b < B.b && l==B.l)return 1;
else if(h< B.h && b== B.b && l==B.l)return 1;
else return 0;
}
};
ostream& operator <<(ostream& out, const Box& B){
cout << B.l << " " << B.b << " " << B.h ;
return out;
}
问题是您没有任何针对过载operator<<
的好友声明,并且由于l
、b
和h
是private
,因此无法从过载operator<<
内部访问它们。
要解决问题,您只需为operator<<
提供一个好友声明,如下所示:
class Box{
int l, b, h;
//other code here as before
//--vvvvvv----------------------------------------->friend declaration added here
friend ostream& operator <<(ostream& out, const Box& B);
};
//definition same as before
ostream& operator <<(ostream& out, const Box& B){
cout << B.l << " " << B.b << " " << B.h ;
return out;
}
工作演示
您可以通过两种方式实现运算符重载:
-
成员函数
如果它是一个成员函数,那么Box的任何实例都可以访问Box类的私有成员。
例如对于运营商">bool运算符<(方框&b)";,当您呼叫b1<b2(其中b1和b2是Box的实例),则可以直接访问"中b1和b2的私有成员;运算符<quot;实施
-
非成员功能
默认情况下,非成员函数不能访问类的私有函数。
因此,要么必须将非成员重载运算符声明为Box类的友元,要么需要为将在该非成员重载操作符中访问的私有成员定义公共函数。
您也可以查看这里的讨论,它清楚地解释了重载运算符何时可以作为成员或非成员函数实现:运算符重载:成员函数与非成员函数?