重载operator <<以输出对象成员而不使用友元函数

chi*_*aja 4 c++ operator-overloading friend-function

经过长时间的差距,我正在刷新cpp,试图理解运算符重载方法.我试图重载"operator <<"来输出对象的成员.但是如果不使用朋友功能,我无法这样做.我正在寻找一种不使用友元功能的方法.

这是我的班级def:

class Add{
private:
int x;

public:
friend ostream& operator<<(ostream& ostr, Add const& rhs); //Method 1
void operator<<(ostream& ostr);                //Method 2
};
Run Code Online (Sandbox Code Playgroud)

功能实现

//Method 1
ostream& operator<<(ostream &ostr, Add const& rhs)
{
    ostr<<rhs.x;

return ostr;
}

//Method 2
void Add::operator<<(ostream& ostr)
{
    cout<<" using operator<< \n";
    ostr<<x;
}
Run Code Online (Sandbox Code Playgroud)

来自main函数的调用

cout<<Obj_Add;  //calls the Method 1

Obj_Add<<cout;  //calls the Method 2
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,我想在不使用friend函数的情况下实现方法1类型调用.但是不知道,cpp是否有可能.我尝试了很少的实现,但都给了我编译错误.请帮助我理解我在这里缺少的观点.

Xeo*_*Xeo 5

如果你的课程中有公共访问者功能,或类似stream的功能,你不需要友谊operator<<:

// v1
class foo{
public:
  int data() const{ return _data; }
private:
  int _data;
};

std::ostream& operator<<(std::ostream& o, foo const& f){
  return o << f.data();
}

// v2
class foo{
public:
  void stream_to(std::ostream& o){
    o << _data;
  }
private:
  int _data;
};

std::ostream& operator<<(std::ostream& o, foo const& f){
  f.stream_to(o);
  return o;
}
Run Code Online (Sandbox Code Playgroud)

v2具有允许stream_to成为virtual函数的额外好处,这对多态基类有帮助,因此您不需要operator<<为每个派生类重新实现stream_to.