Что правильный путь состоит в том, чтобы перегрузить потоковые операторы <<>> для моего класса?

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

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

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

5
задан Peter Alexander 28 February 2010 в 18:11
поделиться

4 ответа

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

class Thing {
public:
  friend istream& operator>>(istream&, Thing&);
  ...
}
9
ответ дан 18 December 2019 в 06:22
поделиться

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

6
ответ дан 18 December 2019 в 06:22
поделиться

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

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;
}
8
ответ дан 18 December 2019 в 06:22
поделиться

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

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

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

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

2
ответ дан 18 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: