Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
119
Добавлен:
10.12.2013
Размер:
856 Кб
Скачать

Использование классов функциональных объектов для настройки шаблонных классов

Функциональным объектом называется объект, для которого перегружена операция вызова функции operator(). Класс, экземпляром которого является этот объект, называется функциональным классом. В таком классе не нужны другие поля и методы.

Пример.

struct LessThan

{

bool operator()(const int x, const int y)

{

return x<y;

}

};

Использование такого класса имеет специфический синтаксис:

int main()

{

LessThan x;

int a=5,b=10;

if( x(a,b)) cout<<a<<”<”<<b;

}

Здесь х – это объект функционального класса. Можно записать функциональный объект по-другому:

if LessThan()(a,b) cout<<a<<”<”<<b;

Пример: Написать шаблонный класс для выбора одного из двух значений, хранящихся в этом классе. Критерий выбора передается как параметр шаблона.

template <class T>

struct LessThan

{

bool operator()(const T&x,const T&y)

{

return x<y;

}

};

struct GreaterThan

{

bool operator()(const T&x,const T&y)

{

return x>y;

}

};

template <class T, class Compare>

class PairSelect

{

T a, b;

public:

PairSelect(const T &x, const T & y):a(x),b(y){}//конструктор

void Show()const

{

if(Compare()(a,b)) cout<<a; else cout<<b;

}

};

void main()

{

PairSelect<int,LessThan<int>>p1(15,10);

p1.Show();//вывод 10

PairSelect<double,GreaterThan<double>>p2(15.5,10.1);

p2.Show();//вывод 15.5

}

Потоковые классы С++ ( 4 часа).

  1. Понятие потока

Поток — это абстрактное понятие, относящееся к любому переносу данных от источника к приемнику.

Чтение данных из потока называется извлечением, вывод в поток — помещением, или включением.

Поток определяется как последовательность байтов и не зави­сит от конкретного устройства, с которым производится обмен (оперативная па­мять, файл на диске, клавиатура или принтер). Обмен с потоком для увеличения скорости передачи данных производится, как правило, через специальную об­ласть оперативной памяти — буфер. Буфер накапливает байты, и фактическая передача данных выполняется после заполнения буфера. При вводе это дает возможность исправить ошибки, если данные из буфера еще не отправлены в программу.

С++ предоставляет возможность ввода/вывода как на низком уровне – неформатированный ввод-вывод, так и на высоком – форматированный ввод-вывод. При неформатированном вводе/выводе передача информации осуществляется блоками байтов данных без какого-либо преобразования. При форматированном - байты группируются таким образом, чтобы их можно было воспринимать как типизированные данные (целые числа, строки символов, числа с плавающей запятой и т. п.)

Рисунок 9 Потоки ввода вывода

По направлению обмена потоки можно разделить на входные (данные вводятся в память), выходные (данные выводятся из памяти) и двунаправленные (допускаю­щие как извлечение, так и включение).

По виду устройств, с которыми работает поток, потоки можно разделить на стан­дартные, файловые и строковые.

Стандартные потоки предназначены для передачи данных от клавиатуры и на экран дисплея, файловые потоки — для обмена информацией с файлами на внеш­них носителях данных (например, на магнитном диске), а строковые потоки — для работы с массивами символов в оперативной памяти.