Я немного смущен тем, как перегрузить потоковые операторы для моего класса в C++, так как кажется, что они - функции на потоковых классах, не на моем классе. Что нормальный путь состоит в том, чтобы сделать это? В данный момент, для "добираются от" оператора, у меня есть определение
istream& operator>>(istream& is, Thing& thing) { // etc...
который работает. Это не упоминается в определении Вещи класс. Я хочу, чтобы это смогло получить доступ к членам моей Вещи класс в его реализации - как я делаю это?
Ваша реализация в порядке. Единственный дополнительный шаг, который вам нужно выполнить, - это объявить вашего оператора другом
в 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, которую можно использовать как для потоковой передачи, так и для других целей.