12.3.6. Реализация объекта-функции
12.3.6. Реализация объекта-функции
При реализации программы в разделе 12.2 нам уже приходилось определять ряд объектов-функций. В этом разделе мы изучим необходимые шаги и возможные вариации при определении класса объекта-функции. (В главе 13 определение класса рассматривается детально; в главе 15 обсуждается перегрузка операторов.).В самой простой форме определение класса объекта-функции сводится к перегрузке оператора вызова. Вот, например, унарный объект-функция, определяющий, что
// простейшая форма класса объекта-функции
class less_equal_ten {
public:
bool operator() ( int val )
{ return val = 10; }
некоторое значение меньше или равно 10:
};
Теперь такой объект-функцию можно использовать точно так же, как предопределенный. Вызов алгоритма count_if() с помощью нашего объекта-функции выглядит следующим образом:
count_if( vec.begin(), vec.end(), less_equal_ten() );
Разумеется, возможности этого класса весьма ограничены. Попробуем применить
count_if( vec.begin(), vec.end(),
отрицатель, чтобы подсчитать, сколько в контейнере элементов, больших 10:
not1(less_equal_then ()));
или обобщить реализацию, разрешив пользователю задавать значение, с которым надо сравнивать каждый элемент контейнера. Для этого достаточно ввести в класс член для хранения такого значения и реализовать конструктор, инициализирующий данный член
class less_equal_value {
public:
less_equal_value( int val ) : _val( val ) {}
bool operator() ( int val ) { return val = _val; }
private:
int _val;
указанной пользователем величиной:
};
Новый объект-функция применяется для задания произвольного целого значения. Например, при следующем вызове подсчитывается число элементов, меньших или равных 25:
count_if( vec.begin(), vec.end(), less_equal_value( 25 ));
Разрешается реализовать класс и без конструктора, если параметризовать его значением, с которым производится сравнение:
template int _val
class less_equal_value {
public:
bool operator() ( int val ) { return val = _val; }
};
Вот как надо было бы вызвать такой класс для подсчета числа элементов, меньших или равных 25:
count_if( vec.begin(), vec.end(), less_equal_value25());
(Другие примеры определения собственных объектов-функций можно найти в Приложении.)
Упражнение 12.4
Используя предопределенные объекты-функции и адаптеры, создайте объекты-функции для решения следующих задач:
(a)Найти все значения, большие или равные 1024.
(b)Найти все строки, не равные "pooh".
(c)Умножить все значения на 2.
Упражнение 12.5
Определите объект-функцию для возврата среднего из трех объектов. Определите функцию для выполнения той же операции. Приведите примеры использования каждого объекта непосредственно и путем передачи его функции. Покажите, в чем сходство и различие этих решений.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Понятия объекта и экземпляра объекта
Понятия объекта и экземпляра объекта В начале этой главы мы познакомились с типами данных, определяющими саму природу данных и набор действий, которые можно выполнять с этими данными. Так, строковый тип определяет, что данные этого типа представляют собой строки —
Понятия объекта и экземпляра объекта
Понятия объекта и экземпляра объекта В начале этой главы мы познакомились с типами данных, определяющими саму природу данных и набор действий, которые можно выполнять с этими данными. Так, строковый тип определяет, что данные этого типа представляют собой строки —
Продолжение объекта
Продолжение объекта Snap to Extension – привязка к продолжениям объектов.Она необходима в том случае, когда при построении объектов требуется использовать линии, являющиеся временным продолжением существующих линий и дуг. Данный режим можно совмещать с режимом Apparent Intersect с
Разрыв объекта
Разрыв объекта Команда BREAK позволяет удалять части объекта или разбивать его на два. Для ее запуска следует нажать кнопку Break (Разрыв) на вкладке Home (Основная) в группе Modify (Редактирование) ленты или на панели инструментов Modify (Редактирование). Можно также выполнить команду
3.1. Природа объекта
3.1. Природа объекта Что является и что не является объектом? Способностью к распознанию объектов физического мира человек обладает с самого раннего возраста. Ярко окрашенный мяч привлекает внимание младенца, но, если спрятать мяч, младенец, как правило, не пытается его
Реализация паттерна «Стратегия» посредством указателей на функции
Реализация паттерна «Стратегия» посредством указателей на функции Идиома NVI – это интересная альтернатива открытым виртуальным функциям, но с точки зрения проектирования она дает не слишком много. В конце концов, мы по-прежнему используем виртуальные функции для
Продолжение объекта
Продолжение объекта Snap to Extension – привязка к продолжениям объектов.Она необходима в том случае, когда при построении объектов требуется использовать линии, являющиеся временным продолжением существующих линий и дуг. Данный режим можно совмещать с режимом Apparent Intersect с
Продолжение объекта
Продолжение объекта Snap to Extension – привязка к продолжениям объектов.Она необходима в том случае, когда при построении объектов требуется использовать линии, являющиеся временным продолжением существующих линий и дуг. Данный режим можно совмещать с режимом Apparent Intersect с
Разрыв объекта
Разрыв объекта Команда BREAK позволяет удалять части объекта или разбивать объект на два. Для ее запуска следует нажать кнопку Break (Разрыв) на вкладке Home (Основная) в группе Modify (Редактирование) ленты или на панели инструментов Modify (Редактирование). Можно также выполнить
Освещенность объекта
Освещенность объекта Освещенность объекта съемки прямо пропорциональна яркости источника света. При увеличении яркости света в два раза освещенность предмета также увеличится вдвое. При искусственном свете освещенность зависит от расстояния между источником света и