Как правильно перегрузить операторы потока << >> для моего класса?

Я немного озадачен тем, как перегрузить потоковые операторы для моего класса в C++, так как кажется, что они являются функциями потоковых классов, а не моего класса. Какой нормальный способ сделать это? На данный момент для оператора "получить от" у меня есть определение

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

который работает. Это не упоминается в определении класса Thing. Я хочу, чтобы он имел доступ к членам моего класса Thing в своей реализации - как мне это сделать?

4 ответа

Решение

Ваша реализация в порядке. Единственный дополнительный шаг, который вам нужно выполнить, это объявить вашего оператора как friend в Thing:

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

Другие ответы верны. В случае, если это поможет вам, вот пример кода ( источник):

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;
}

Вы делаете свой operator>> друг класса Thing.

Есть несколько подходов, и правильный действительно зависит от того, что делает класс.

Довольно часто имеет смысл иметь публичный API, который позволяет читать информацию, и в этом случае операторам потоковой передачи не требуется доступ к частным лицам.

Вероятно, самый популярный подход - объявлять функции потоковой передачи друзьями класса.

Мой фаворит - предоставление публичной функции шаблона стиля Boost.Serialization, которую можно использовать как для потоковой передачи, так и для других целей.

Другие вопросы по тегам