C++ использует парадигму потока для реализации стандартного ввода/вывода.
Потоковая парадигма означает, что если ваше приложение хочет получить доступ/использовать ресурс (файл, консоль и т. д.), поток действует как посредник между вашим приложением и ресурсом:
ofstream +----+
+-------------------->|File|
| +----+
|
+------+------+
| Application |
+------+------+
|
| +-------+
+-------------------->|Console|
cout +-------+
Это означает, что все операции записи/чтения, которые вы выполняете, на самом деле являются потоковыми операциями. Дело в том, что потоковые операции в основном одинаковы, независимо от того, какой тип ресурса (и какой тип потока) вы используете.
Это позволяет нам реализовать «общий» (общий смысл, действительный для любого типа потока/ресурса). Как? Перегрузка операторов C++ >> и ‹‹.
Для операций ввода (ввод означает получение данных из потока и помещение их в нашу переменную/объект) нам нужно перегрузить оператор >> следующим образом:
istream& operator>>(istream& is , MyClass& object)
{
is >> object.myClassAtributte; (1)
... //Same for every attribute of your class.
return is;
}
Во-первых, обратите внимание, что входной поток передается по ссылке. По ссылке, потому что потоки не копируются (Что именно означает копирование потока? Скопируйте ссылку между вашим приложением и ресурсом? Звучит смешно), и неконстантны, потому что вы собираетесь изменить поток (Вы собираетесь написать через это).
Наконец, обратите внимание, что функция не возвращает void, а возвращает ссылку на тот же поток, который был передан в функцию. Это позволяет вам писать конкатенированные предложения записи/чтения, такие как cout << "Hello. " << "Im" << " Manu343726" << endl;
Для операций вывода (Output означает отправку данных в поток) нам нужно перегрузить оператор ‹‹, реализация которого точно такая же:
ostream& operator<<(ostream& os , const MyClass& object)
{
os << object.myClassAtributte; (1)
... //Same for every attribute of your class.
return os;
}
Обратите внимание, что в этом случае ваш объект передается как константа, потому что мы не будем его изменять (мы будем только читать его атрибуты).
(1) Предпочтительно реализовать эти функции, сделав их друзьями вашего класса, чтобы предоставить нам доступ к закрытым/защищенным членам.
person
Manu343726
schedule
08.06.2013