什么是重载流操作符的正确方法<< >>为了我的班级?

时间:2010-02-28 17:59:49

标签: c++ operator-overloading stream-operators

我对如何在C ++中为我的类重载流操作符感到困惑,因为它似乎是流类上的函数,而不是我的类。这样做的正常方法是什么?目前,对于“来自”运算符,我有一个定义

istream& operator>>(istream& is, Thing& thing) { // etc...

哪个有效。在Thing类的定义中没有提到它。我希望它能够在其实现中访问我的Thing类的成员 - 我该怎么做?

4 个答案:

答案 0 :(得分:9)

您的实施很好。您需要执行的唯一额外步骤是在friend中将您的运营商声明为Thing

class Thing {
public:
  friend istream& operator>>(istream&, Thing&);
  ...
}

答案 1 :(得分:8)

其他答案是正确的。如果它对您有帮助,这是一个代码示例(source):

class MyClass {
  int x, y;
public:
  MyClass(int i, int j) { 
     x = i; 
     y = j; 
  }
  friend ostream &operator<<(ostream &stream, MyClass ob);
  friend istream &operator>>(istream &stream, MyClass &ob);
};

ostream &operator<<(ostream &stream, MyClass ob)
{
  stream << ob.x << ' ' << ob.y << '\n';

  return stream;
}

istream &operator>>(istream &stream, MyClass &ob)
{
  stream >> ob.x >> ob.y;

  return stream;
}

答案 2 :(得分:6)

你让operator>>成为Thing课程的朋友。

答案 3 :(得分:2)

有几种方法,而正确的方法实际上取决于课程的作用。

通常有一个允许读取信息的公共API是有意义的,在这种情况下,流媒体运营商不需要访问私有。

可能最流行的方法是宣传流媒体功能的朋友。

我最喜欢的是提供一个公共的Boost.Serialization样式模板函数,可用于任何方式的流式传输以及其他方式。