Объектно-ориентированное программирование. Богомолов А - 24 стр.

UptoLike

24
ва и показывается на двух небольших демонстрационных программах, как им пользо-
ваться.
Одним из самых полезных видов классов является контейнерный класс, т.е. та-
кой класс, который хранит объекты каких-то других типов. Списки, массивы, ассоциа-
тивные массивы и множества - все это контейнерные классы. Но контейнерные классы
обладают тем интересным
свойством, что тип содержащихся в них объектов не имеет
особого значения для создателя контейнера, но для пользователя конкретного контей-
нера этот тип является существенным. Следовательно, тип содержащихся объектов
должен параметром контейнерного класса, и создатель такого класса будет определять
его с помощью типа-параметра. Для каждого конкретного контейнера (т.е. объекта кон
-
тейнерного класса) пользователь будет указывать каким должен быть тип содержащих-
ся в нем объектов.
Использование шаблонных классов означает наличие шаблонных функций-
членов. Помимо этого, можно определить глобальные шаблонные функции, т.е. шабло-
ны типа для функций, не являющихся членами класса. Шаблон типа для функций по-
рождает семейство функций точно также,
как шаблон типа для класса порождает се-
мейство классов. Эту возможность мы обсудим на последовательности примеров, в ко-
торых приводятся варианты функции сортировки sort(). Каждый из вариантов в после-
дующих разделах будет иллюстрировать общий метод. Как обычно мы сосредоточим-
ся на организации программы, а не на разработке ее алгоритма, поэтому использоваться
будет
тривиальный алгоритм. Все варианты шаблона типа для sort() нужны для того,
чтобы показать возможности языка м полезные приемы программирования. Варианты
не упорядочены в соответствии с тем, насколько они хороши. Кроме того, можно об-
судить и традиционные варианты без шаблонов типа, в частности, передачу указателя
на функцию, производящую сравнение.
Введение операций с помощью параметров шаблонного класса.
Возможны ситуации, когда неявность связи между шаблонной функцией sort() и
шаблонным классом Comparator создает трудности. Неявную связь легко упустить из
виду и в то же время разобраться в ней может быть непросто. Кроме того, поскольку
эта связь "встроена" в функцию sort(), невозможно использовать эту функцию для сор-
тировки векторов одного типа, если операция
сравнения рассчитана на другой тип. По-
местив функцию sort()в класс, мы можем явно задавать связь с классом Comparator:
template class Sort {
public:
static void sort(Vector&);
};
Не хочется повторять тип элемента, и это можно не делать, если использовать
typedef в шаблоне Comparator:
template class Comparator {
public:
typedef T T; // определение Comparator::T
static int lessthan(T& a, T& b) {
return a < b;
}
// ...
                                         24

ва и показывается на двух небольших демонстрационных программах, как им пользо-
ваться.
       Одним из самых полезных видов классов является контейнерный класс, т.е. та-
кой класс, который хранит объекты каких-то других типов. Списки, массивы, ассоциа-
тивные массивы и множества - все это контейнерные классы. Но контейнерные классы
обладают тем интересным свойством, что тип содержащихся в них объектов не имеет
особого значения для создателя контейнера, но для пользователя конкретного контей-
нера этот тип является существенным. Следовательно, тип содержащихся объектов
должен параметром контейнерного класса, и создатель такого класса будет определять
его с помощью типа-параметра. Для каждого конкретного контейнера (т.е. объекта кон-
тейнерного класса) пользователь будет указывать каким должен быть тип содержащих-
ся в нем объектов.
       Использование шаблонных классов означает наличие шаблонных функций-
членов. Помимо этого, можно определить глобальные шаблонные функции, т.е. шабло-
ны типа для функций, не являющихся членами класса. Шаблон типа для функций по-
рождает семейство функций точно также, как шаблон типа для класса порождает се-
мейство классов. Эту возможность мы обсудим на последовательности примеров, в ко-
торых приводятся варианты функции сортировки sort(). Каждый из вариантов в после-
дующих разделах будет иллюстрировать общий метод. Как обычно мы сосредоточим-
ся на организации программы, а не на разработке ее алгоритма, поэтому использоваться
будет тривиальный алгоритм. Все варианты шаблона типа для sort() нужны для того,
чтобы показать возможности языка м полезные приемы программирования. Варианты
не упорядочены в соответствии с тем, насколько они хороши. Кроме того, можно об-
судить и традиционные варианты без шаблонов типа, в частности, передачу указателя
на функцию, производящую сравнение.

           Введение операций с помощью параметров шаблонного класса.
       Возможны ситуации, когда неявность связи между шаблонной функцией sort() и
шаблонным классом Comparator создает трудности. Неявную связь легко упустить из
виду и в то же время разобраться в ней может быть непросто. Кроме того, поскольку
эта связь "встроена" в функцию sort(), невозможно использовать эту функцию для сор-
тировки векторов одного типа, если операция сравнения рассчитана на другой тип. По-
местив функцию sort()в класс, мы можем явно задавать связь с классом Comparator:
        template class Sort {
        public:
          static void sort(Vector&);
        };

       Не хочется повторять тип элемента, и это можно не делать, если использовать
typedef в шаблоне Comparator:

       template class Comparator {
       public:
         typedef T T; // определение Comparator::T
         static int lessthan(T& a, T& b) {
           return a < b;
         }
         // ...