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

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

Функциональным объектом называется объект, для которого перегружена операция вызова функции 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 часа).рование при вводе-выводе. Манипуляторы. Ввод - вывод объектов пользовательских классов. Состояние потока. Неформатированный ввод-вывод. Классы istream и ostream. Файловый ввод-вывод. Классы ofstream, ifstream, fstream. Обработка ошибок потока -->

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

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

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

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

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

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

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

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

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