1.12. Введение в функциональные объекты
Существует другой способ решения задачи сортировки из предыдущего раздела. Хотя для такой простой задачи он и не нужен, обсуждаемые принципы являются важными для других более сложных случаев, поэтому не стоит пропускать этот раздел при чтении. Функциональным объектом называется класс, где определен оператор вызова, который записывается как operatorQ. От класса не требуется наличия каких-либо других членов. Давайте начнем с очень простого примера. (Здесь и далее мы пишем iostream.h вместо iostream, поскольку в последнем случае VC5 также требует наличия строчки using namespace std, a BC5, напротив, не позволяет использовать эту строчку, если не включаются типичные заголовки STL, такие как vector.)
II funobj.cpp: Очень простой функциональный объект. #include <iostream.h>
class compare { public:
int operator()(int x, int y)const
{ return x > y;
} };
int main() { compare v;
cout « v(2, 15) « endl; // Вывод: О
cout << compare()(5, 3) << endl; // Вывод: 1
cout << endl;
return 0; }
Так как для класса compare определен оператор вызова функции, operatorQ, с двумя параметрами типа int, мы можем использовать выражение v(2,15), где v - переменная этого класса. Это выражение на самом деле является сокращенной формой записи вместо v.operatorQ{2, 15) и таким образом приводит к вызову функции-члена operatorQ класса compare, возвращающей значение 0, поскольку 2 не больше 15. Второй вызов
compare 0(5, 3)
выглядит довольно необычно. Первая часть этой записи, compareQ, представляет собой вызов конструктора по умолчанию класса compare. Другими словами, выражение compareQ представляет объект типа compare, и за ним, как иу v, может следовать список аргументов, в этом примере (5, 3). Следующая программа, основывающаяся на использовании функционального объекта, эквивалентна программе dsortl из предыдущего раздела:
// dsort2 .срр: Сортировка в нисходящем порядке
// с использованием определенного нами
// функционального объекта.
#include <iostream>
#include <algorithm>
using namespace std;
class compare {
public:
bool operator()(int x, int у)const
{ return x > y;
} };
int main()
{ const int N = 8;
int a[N] =
{1234, 5432, 8943, 3346, 9831, 7842, 8863, 9820};
<< назад вперед >>