POV: у вас есть структура/класс, в который вы хотите добавить возможности ввода-вывода, но вы не знаете, как это сделать.
C++ позволяет переопределить операторы «››» и «‹‹», соответствующие входным и выходным потокам соответственно.
Давайте построим пример; Структура Point содержит два значения, x и y. Он печатает информацию о себе с помощью функции cout
при создании.
struct Point { int x, y; Point(int _x, int _y): x(_x), y(_y) { std::cout << "Created point with coordinates: " << *this << "\n"; }; }; int main() { Point p(123, 456); return 0; }
Выполнение этого кода прервется, потому что наш выходной поток не знает, как обрабатывать нашу пользовательскую структуру данных. Мы можем переопределить оператор <<
, чтобы четко определить желаемое поведение.
friend ostream& operator<<(ostream& os, const Point& point) { return os << point.x << ' ' << point.y; }
Добавление этой функции класса приведет к тому, что cout
или любая другая операция потоковой передачи вывода будет печатать координаты x и y точки с разделителем-пробелом.
Обратите внимание, что мы объявляем наше переопределение как «функция друга». Выходной поток будет там, где вызывается эта функция, а не внутри нашего класса.
— — —
Теперь предположим, что мы хотим прочитать координаты точки из источника ввода, например, аргументы, прочитанные через CLI. Мы могли бы сделать это, напрямую сканируя отдельные числа x и y, но нам нужно более элегантное решение.
struct Point { ... }; int main() { Point p; cin >> p; return 0; }
Этого можно добиться, переопределив оператор >>
. Реализация почти такая же, как и для переопределения оператора <<
. Еще раз обратите внимание, что это функция друга; в этом случае функция будет вызываться из класса istream
.
friend istream& operator>>(istream& is, Point& point) { return is >> point.x >> ' ' >> point.y; }
Собрав все это вместе, наш последний пример выглядит так:
struct Point { int x, y; friend ostream& operator<<(ostream& os, const Point& point) { return os << point.x << ' ' << point.y; } friend istream& operator>>(istream& is, Point& point) { return is >> point.x >> ' ' >> point.y; } Point(int _x, int _y): x(_x), y(_y) { std::cout << "Created point with coordinates: " << *this << "\n"; }; }; int main() { Point p; std::cin >> p; std::cout << "Point coordinates: " << p; return 0; }
Вот и все, все готово. Удачного кодирования!