Как правильно перегрузить операторы потока << >> для моего класса?
Я немного озадачен тем, как перегрузить потоковые операторы для моего класса в 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;
}
Есть несколько подходов, и правильный действительно зависит от того, что делает класс.
Довольно часто имеет смысл иметь публичный API, который позволяет читать информацию, и в этом случае операторам потоковой передачи не требуется доступ к частным лицам.
Вероятно, самый популярный подход - объявлять функции потоковой передачи друзьями класса.
Мой фаворит - предоставление публичной функции шаблона стиля Boost.Serialization, которую можно использовать как для потоковой передачи, так и для других целей.