如何为我的类重载流运算符<<和>>?

5

我有点困惑如何在C++中为我的类重载流运算符,因为它们似乎是流类上的函数,而不是在我的类上。那么正常的做法是什么呢?目前,对于“获取自”运算符,我有一个定义:

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

这个方法可以正常工作。在Thing类的定义中没有提到它。我希望它能够在实现中访问我的Thing类的成员 - 我该怎么做?

4个回答

9
你的实现很好。你需要执行的唯一额外步骤是在Thing中声明你的运算符为friend
class Thing {
public:
  friend istream& operator>>(istream&, Thing&);
  ...
}

谢谢。它不在“public:”部分意味着什么? - ghallio

8
其他答案是正确的。如果有帮助的话,这里是一个代码示例(源代码):链接
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
我会将operator<<定义如下:ostream &operator<<(ostream &stream, const MyClass& ob); - Dmitry K.

6
你需要将你的 operator>> 声明为 Thing 类的友元。

2

有几种方法可供选择,正确的方法取决于类的功能。

通常情况下,具有公共API以允许读取信息是有意义的,在这种情况下,流操作符不需要访问私有成员。

可能最受欢迎的方法是将流函数声明为类的友元函数。

我最喜欢的方法是提供一个公共的Boost.Serialization风格的模板函数,可以用于任何方向的数据流,并且还可以用于其他事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接