- •Раздел 4. Разработка по Тема 4.1. Проектирование интерфейса с пользователем
- •4.1.1. Типы пользовательских интерфейсов.
- •4.1.2. Пользовательская и программная модели интерфейса.
- •4.1.3. Разработка диалогов.
- •4.1.4. Основные компоненты графических пользовательских интерфейсов.
- •Тема 4.2. Реализация графических пользовательских интерфейсов.
- •4.2.1. Диалоги, управляемые пользователем.
- •4.2.2. Диалоги, управляемые системой.
- •4.2.3. Использование метафор.
- •4.2.4. Технология Drag and Drop.
- •4.2.5. Интеллектуальные элементы.
- •4.3.1. Базовые типы данных.
- •Константы
- •Область действия имен
- •4.3.2. Указатели и адресная арифметика.
- •4.3.3. Составные типы данных. Структуры
- •Битовые поля
- •Определение типов
- •Перечислимые типы
- •4.3.4. Выражения и операции.
- •4.3.5. Управляющие конструкции. Условные операторы
- •Операторы циклов
- •4.4.1. Статические одномерные массивы.
- •4.4.2. Статические многомерные массивы.
- •4.4.3. Динамические массивы.
- •4.4.4. Массивы указателей.
- •4.5.1. Стеки.
- •4.5.2. Очереди.
- •4.5.3. Списки.
- •4.5.4. Бинарные деревья.
- •4.6.1. Объявление классов и экземпляров классов.
- •4.6.2. Инкапсуляция данных и методов.
- •4.6.3. Конструкторы классов.
- •Конструктор по умолчанию
- •Конструктор копирования
- •4.6.4. Деструкторы классов.
- •4.7.1. Разделы в описании класса.
- •4.7.2. Friend-конструкции.
- •4.7.3. Статические члены классов.
- •4.7.4. Использование описателя const в классах.
- •4.8.1. Вложенность классов.
- •4.8.2. Наследование данных и методов.
- •4.8.3. Типы наследования.
- •4.9.1. Полиморфизм раннего связывания.
- •4.9.2. Полиморфизм позднего связывания и виртуальные функции.
- •4.9.3. Абстрактные методы и классы.
- •4.10.1. Функции консольного ввода-вывода.
- •4.10.2. Функции файлового ввода-вывода.
- •4.10.3. Использование библиотеки классов потокового ввода-вывода.
- •4.11.1. Перегрузка операций.
- •4.11.2. Шаблоны функций.
- •4.11.3. Шаблоны классов.
- •4.11.4. Обработка исключений.
- •Тема 4.12. Com-технология.
- •4.12.1. Основные понятия.
- •4.12.2. Типы интерфейсов.
- •Свойства интерфейсов
- •Типы интерфейсов
- •4.12.3. Типы com-объектов.
- •4.12.4. Фабрика классов.
- •Тема 4.13. Построение com-сервера.
- •4.13.1. Язык idl.
- •Содержимое файла idl
- •4.13.2. Определение пользовательского интерфейса.
- •4.13.3. Реализация пользовательского интерфейса.
- •4.13.4. Создание тестового клиента.
- •Тема 4.14. Обзор платформы ms .Net.
- •4.14.1. Общая идея архитектуры .Net.
- •4.14.2. Достоинства и недостатки .Net.
- •4.14.3. Схема трансляции программ в .Net.
- •4.14.4. Язык msil.
- •4.14.5. Объектно-ориентированная модель .Net.
4.11.2. Шаблоны функций.
Шаблон функций (function template) является средством языка C++, позволяющим избежать рутинного переписывания кодов функций, которые имеют сходный алгоритм, но разные типы параметров. Классическим примером, иллюстрирующим выгоды шаблона, является множество реализаций функции max(a,b). При отсутствии механизма шаблонов для придания функции max универсального характера следует создать несколько функций, совмещающих одно и то же имя. Например:
long max (long a. long b):
double max (double a, double b):
Vector& max (Vector& a, Vector& b);
Очевидно, что тела всех функций могут выглядеть совершенно одинаково для многих типов параметров. Например, коды могут иметь вид:
return (a>b) ? a : b;
В таких случаях удобно использовать шаблон функции. Шаблон задается ключевым словом template:
template <class Т> Т max(T х, Т у)
{
return (х>у) ? х : у;
};
Здесь <class T> является аргументом шаблона. Символ Т (type) означает произвольный тип данных Т, который будет задан при использовании шаблона. Символ Т выполняет роль формального параметра, поэтому сам этот символ может быть и другим, но везде одинаковым. При фактическом использовании шаблона место Т заменяет какой-то уже описанный тип. Им может быть как стандартный тип языка, так и новый тип, определенный пользователем. В том числе он может быть и именем класса, определенного ранее. Важно, чтобы для типа был определен смысл операции > («больше»). Если Т заменяется классом, то в классе должен быть предварительно реализован operator>(). Компилятор генерирует подходящие коды функции max в соответствии с конкретными типами фактических параметров, использованных при вызове функции. Например, встретив во внешней функции коды:
Vector a(2,1), b(0,4), с;
с = max (a, b);
printf ("\n Норма вектора c=max(a,b) = %6.2f",!c);
компилятор в сгенерированной по заданному шаблону копии функции mах() (при сравнении объектов класса Vector) использует функцию operator>(), которая была определена в классе Vector:
bool operator >(Vector& v)
{return !*this > !v;}
Если в той же внешней функции встретится оператор:
printf ("\n max (10,11) = %d",max (10,11)),
то компилятор в другой копии функции max, сгенерированной по тому же шаблону, использует операцию >, определенную для стандартного типа данных int. Один раз написав шаблон функции max, мы можем вызывать ее для всех типов данных, для которых определена функция operator>(). Если для какого-то типа данных существующая версия тела функции max не годится, то можно отменить (override) действие template функции для этого типа. Например, определив функцию:
char* max (char* s. char *t)
{
return (strcmp (s. t) > 0) ? s : t;
}
мы отменяем действие шаблона для символьных строк, так как функция, скроенная по шаблону, осуществляла бы ничего не значащее сравнение указателей s и t.
При использовании шаблона следует строго соблюдать типы параметров и не надеяться на стандартные преобразования типов, по умолчанию осуществляемые компилятором при вызове обычных функций. Например, явно заданную функцию
double max (double, double);
можно вызывать с аргументами (int, double) или (float, long). Компилятор автоматически преобразует параметры к типу double. Однако, если явная декларация функции, скрывающей шаблон, отсутствует, то шаблон
template <class Т> Т тах(Т х. Т у)
не позволит смешивать типы при вызове функции. Таким образом обращение
int i=max(9,8.);
вызывает сообщение об ошибке, которое информирует вас, что не найдена функция max для пары аргументов типа (int, double).