我发现自己尝试正确重载operator <我有一个类(寄存器),用于存储另一个类(Film的子类,它是抽象的)的标本。重载的<
class Register{
private:
int elementNum;
Film* pData;
};
ostream &operator<<(ostream & os,const Register &v);
这些位于头文件中,运算符<
ostream &operator<<(ostream & os,const Register &v){
for(int i=0;i<v.elementNum;i++){
os<<v.pData[i].print()<<endl;
}
return os;
}
问题是,这样我无法访问Register的私有变量。因此,我尝试将重载的运算符<
最佳答案
如果必须授予对operator<<
实现(私有数据)的访问权限,则必须将Register
声明为朋友:
class Register{
private:
//...
friend std::ostream &operator<<( std::ostream & os,const Register &v);
};
std::ostream &operator<<( std::ostream & os,const Register &v) {
for( int i=0; i<v.elementNum; i++){
os << v.pData[i].print() << std::endl;
}
return os;
}
Friend函数可以访问声明为Friends的类的所有私有(以及受保护的和Public的)数据。
C ++标准n3337§11.3 / 1说
友人
类的朋友是被授予以下权限的函数或类
使用该类的私有和受保护的成员名称。一类
通过朋友声明指定其朋友(如果有)。这样
声明为朋友提供了特殊的访问权限,但他们确实
不要成为被提名的朋友。
§11.3 / 2
宣布一个班级为好友意味着该班级的名称为private和
可以访问类授予友谊的受保护成员
在伙伴的基本说明符和成员声明中
类。
关于c++ - 运算符<<和继承/组成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23687741/