我发现自己尝试正确重载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/

10-13 03:39