Программирование >>  Инициализация объектов класса, структура 

1 ... 347 348 349 [ 350 ] 351 352 353 ... 395


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;

На этом примере показан целый ряд проблем, имеющих отношение к возможным ошибочным состояниям входного потока:



1 ... 347 348 349 [ 350 ] 351 352 353 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика