|
Программирование >> Инициализация объектов класса, структура
int main() { WordCount search( rosebud ); для простоты явно введем 8 вхождений search.found(11,3); search.found(11,8); search.found(14,2); search.found(34,6); search.found(49,7); search.found(67,5); search.found(81,2); search.found(82,3); search.found(91,4); search.found(97,8); cout << Вхождения: << \n << search << endl; return 0; После компиляции и запуска программа выводит следующее: Вхождения: <10> rosebud <11,3> <11,8> <14,2> <34,6> <49,7> <67,5> <81,2> <82,3> <91,4> <97,8> Полученный результат сохранен в файле output. Далее мы определим оператор ввода, с помощью которого прочитаем данные из этого файла. Упражнение 20.7 class Date { public: public: ... private: int month, day, year; Дано определение класса Date: Напишите перегруженный оператор вывода даты в формате: (a) полное название месяца September 8th, 1997 9 / 8 / 97 (c) Какой формат лучше? Объясните. (d) Должен ли оператор вывода Date быть функцией-другом? Почему? Упражнение 20.8 Определите оператор вывода для следующего класса CheckoutRecord: class CheckoutRecord { / / запись о в1даче public: public: ... private: double book id; идентификатор книги string title; название Date date borrowed; дата выдачи Date date due; дата возврата pair<string,string> borrower; кому выдана vector pair<string,string> wait list; очередь на книгу 20.5. Перегрузка оператора ввода Перегрузка оператора ввода (>>) похожа на перегрузку оператора вывода, но, к сожалению, возможностей для ошибок гораздо больше. Вот, например, его реализация для класса WordCount: #include <iostream> #include WordCount.h /* необходимо модифицировать определение класса WordCount, чтобы оператор ввода был другом class WordCount friend ostreams operator<<( ostreams, const WordCounts ); friend istreams operator>>( istreams, const WordCounts ); istreams operator >>( istream sis, WordCount swd ) { /* формат хранения объекта WordCount: * <2> строка * <7,3> <12,36> */ int ch; /* прочитать знак <. Ес его нет, * перевести поток в ошибочное состояние и вти if ((ch = is.get()) != < ) is.setstate( ios base::badbit ); return is; прочитать длину t occurs; is >> occurs; читать до обнаружения >; ошибки не контролируются while ( is ss (ch = is.get()) != > ) ; is >> wd. word; прочитать позиции вхождений; каждая позиция имеет формат: < строка, колонка > for ( int ix = 0; ix < occurs; ++ix ) int line, col; извлечь значения while (is ss (ch = is.get())!= < ) ; is >> line; while (is ss (ch = is.get())!= , ) ; is >> col; while (is ss (ch = is.get())!= > ) ; wd. occurList.push back( Location( line, col )); return is; На этом примере показан целый ряд проблем, имеющих отношение к возможным ошибочным состояниям входного потока:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |