5

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

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

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

4

4 回答 4

9

你的实现很好。您需要执行的唯一额外步骤是将您的运算符声明为friendin Thing

class Thing {
public:
  friend istream& operator>>(istream&, Thing&);
  ...
}
于 2010-02-28T18:02:42.407 回答
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;
}
于 2010-02-28T18:05:32.633 回答
6

你让你operator>>成为 Thing 类的朋友。

于 2010-02-28T18:02:30.290 回答
2

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

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

可能最流行的方法是将流函数声明为类的朋友。

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

于 2010-02-28T18:06:30.827 回答