Как правильно перегрузить операторы потока << >> для моего класса? - PullRequest
5 голосов
/ 28 февраля 2010

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

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

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

Ответы [ 4 ]

9 голосов
/ 28 февраля 2010

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

class Thing {
public:
  friend istream& operator>>(istream&, Thing&);
  ...
}
8 голосов
/ 28 февраля 2010

Остальные ответы верны. Если вам это поможет, вот пример кода ( 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;
}
6 голосов
/ 28 февраля 2010

Вы делаете своего operator>> другом класса Вещь.

2 голосов
/ 28 февраля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...