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

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


Упражнение 20.5

Прочитайте фразу riverrun, from bend of bay to swerve of shore сначала как последовательность из девяти строк, а затем как одну строку.

Упражнение 20.6

С помощью функций getline() и gcount() прочитайте последовательность строк из стандартного ввода и найдите самую длинную (не забудьте, что строку, прочитанную за несколько обращений к getline() , нужно считать одной).

20.4. Перегрузка оператора вывода

Если м1 хотим, чтобы наш тип класса поддерживал операции ввода/вывода, то необходимо перегрузить оба соответствующих оператора. В этом разделе mi рассмотрим, как перегружается оператор вывода. (Перегрузка оператора ввода - тема следующего

class WordCount { friend ostream&

operator ( ostream&, const WordCount& );

public:

WordCount( string word, int cnt=1 );

...

private:

string word; int occurs;

ostream&

operator <<( ostream& os, const { формат: <счетчик> слово

WordCount& wd )

<< wd.word;

return os;

раздела.) Например, для класса WordCount он выглядит так:

Проектировщик должен решить, следует ли выводить завершающий символ новой строки. Лучше этого не делать: поскольку операторы вывода для встроенных типов такой символ не печатают, пользователь ожидает аналогичного поведения и от операторов в других классах. Определенный нами в классе WordCount оператор вывода можно

#include <iostream> #include WordCount.h

int main() {

WordCount wd( sadness , 12 );

cout << wd:\n << wd << endl; return 0;

использовать вместе с любыми другими операторами:

>



<12> sadness

Оператор вывода - это бинарный оператор, который возвращает ссылку на объект класса ostreami. В общем случае структура определения перегруженного оператора вывода

структура перегруженного оператора вывода ostream&

operator <<( ostream& os, const ClassType &object ) {

произвольна код для подготовки объекта

фактическое число членов os << ...

возвращается объект ostream return os;

выглядит так:

Первый его аргумент - это ссылка на объект ostream, а второй - ссылка (обычно константная) на объект некоторого класса. Возвращается ссылка на ostream. Значением всегда является объект ostream, для которого оператор вызывался.

Поскольку первым аргументом является ссылка, оператор вывода должен быть определен как обычная функция, а не член класса. (Объяснение см. в разделе 15.1.) Если оператору необходим доступ к неоткрытым членам, то следует объявить его другом класса. (О друзьях говорилось в разделе 15.2.)

Пусть Location - это класс, в котором хранятся номера строки и колонки вхождения

#include <iostream>

class Location {

friend ostream& operator ( ostream&, const Locations ); private:

short line; short col;

ostreams operator <<( ostreams os, const Locations lc ) {

объект Loc водится в виде: < 10,37 >

os << < << lc. line

<< , << lc. col << > ;

return os;

слова. Вот его определение:

Изменим определение класса WordCount, включив в него вектор occurList объектов Location и объект word класса string:

Программа печатает на терминале строки:



#include <vector> #include <string> #include <iostream> #include Location.h

class WordCount {

friend ostream& operator ( ostream&, const WordCount& ); public:

WordCount() {}

WordCount( const string &word ) : word( word ) {} WordCount( const string &word, int ln, int col )

: word( word ){ insert location( ln, col ); }

string word() const { return word; }

int occurs() const { return occurList.size(); }

void found( int ln, int col )

{ insert location( ln, col ); }

private:

void insert location( int ln, int col )

{ occurList.push back( Location( ln, col )); }

string word;

vector< Location > occurList;

В классах string и Location определен оператор вывода operator (). Так выглядит

ostream&

operator <<( ostream& os, const WordCount& wd )

<< < << wd. o

<< wd. word <<

occurList.size() << > endl;

int cnt = 0, onLine = 6;

vector< Location >::const iterator first

wd. occurList.begin(); vector< Location >::const iterator last

wd. occurList.end();

for ( ; first != last; ++first )

os << Location

os << *first << ;

форматирование: по 6 в строке if ( ++cnt >= onLine )

{ os << \n ; cnt = 0; }

return os;

измененное определение оператора вывода в WordCount:

А вот небольшая программа для тестирования нового определения класса WordCount; позиции вхождений для простоты зашиты в код:



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

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