Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прогр_на_ЯВУ (Cpp)_-_Лекции.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
882.69 Кб
Скачать

19.3.2 Задание свойств класса

Одним из методов использования шаблонов является уточнение поведения с помощью дополнительных параметров шаблона. Предположим, мы пишем функцию сортировки вектора:

template <class T>

void sort_vector(vector<T>& vec)

{

for (int i = 0; i < vec.size() -1; i++)

for (int j = i; j < vec.size(); j++) {

if (vec[i] < vec[j]) {

T tmp = vec[i];

vec[i] = vec[j];

vec[j] = tmp;

}

}

}

Эта функция будет хорошо работать с числами, но если мы захотим использовать ее для массива указателей на строки (char*), то результат будет несколько неожиданный. Сортировка будет выполняться не по значению строк, а по их адресам (операция "меньше" для двух указателей – это сравнение значений этих указателей, т.е. адресов величин, на которые они указывают, а не самих величин). Чтобы исправить данный недостаток, добавим к шаблону второй параметр:

template <class T, class Compare>

void sort_vector(vector<T>& vec)

{

for (int i = 0; i < vec.size() -1; i++)

for (int j = i; j < vec.size(); j++) {

if (Compare::less(vec[i], vec[j])) {

T tmp = vec[i];

vec[i] = vec[j];

vec[j] = tmp;

}

}

}

Класс Compare должен реализовывать статическую функцию less, сравнивающую два значения типа T. Для целых чисел этот класс может выглядеть следующим образом:

class CompareInt

{

static bool less(int a, int b)

{ return a < b; };

};

Сортировка вектора будет выглядеть так:

vector<int> vec;

sort<int, CompareInt>(vec);

Для указателей на байт (строк) можно создать класс

class CompareCharStr

{

static bool less(char* a, char* b)

{ return strcmp(a,b) >= 0; }

};

и, соответственно, сортировать с помощью вызова

vector<char*> svec;

sort<char*, CompareCharStr>(svec);

Как легко заметить, для всех типов, для которых операция "меньше" имеет нужный нам смысл, можно написать шаблон класса сравнения:

template<class T> Compare

{

static bool less(T a, T b)

{ return a < b; };

};

и использовать его в сортировке (обратите внимание на пробел между закрывающимися угловыми скобками в параметрах шаблона; если его не поставить, компилятор спутает две скобки с операцией сдвига):

vector<double> dvec;

sort<double, Compare<double> >(dvec);

Чтобы не загромождать запись, воспользуемся возможностью задать значение параметра по умолчанию. Так же, как и для аргументов функций и методов, для параметров шаблона можно определить значения по умолчанию. Окончательный вид функции сортировки будет следующий:

template <class T, class C = Compare<T> >

void sort_vector(vector<T>& vec)

{

for (int i = 0; i < vec.size() -1; i++)

for (int j = i; j < vec.size(); j++) {

if (C::less(vec[i], vec[j])) {

T tmp = vec[i];

vec[i] = vec[j];

vec[j] = tmp;

}

}

}

Второй параметр шаблона иногда называют параметром-штрих, поскольку он лишь модифицирует поведение класса, который манипулирует типом, определяемым первым параметром.

Список использованных источников

Конспект лекций составлен в основе по материалам Интернет-Университета информационных технологий «ИНТУИТ» www.intuit.ru.

  1. Государственный образовательный стандарт высшего профессионального образования. Направление подготовки дипломированного специалиста 654600 – Информатика и вычислительная техника. Квалификация – инженер. Москва, 2000.

  2. И.Г.Гоулд, Дж.С.Тутилл. Терминологическая работа IFIP (Международная федерация по обработке информации) и ICC (Международный вычислительный центр) // Журн. вычисл. матем. и матем. физ., 1965, #2. - С. 377-386.

  3. Г.Майерс. Надежность программного обеспечения. - М.: Мир, 1980.

  4. Ian Sommerville. Software engineering. - Addison-Wesley Publishing Company, 1992.

  5. Э. Дейкстра. Заметки по структурному программированию / У. Дал, Э. Дейкстра, К. Хоор. Структурное программирование. - М.: Мир, 1975. - С. 7-97.

  6. Criteria for evaluation of software. - ISO TC97/SC7 #367 (Supersedes Document #327).

  7. С.И. Ожегов. Словарь русского языка. - М.: Советская энциклопедия, 1975.

  8. Ф.Я. Дзержинский, И.М. Калиниченко. Дисциплина программирования Д: концепция и опыт реализации методических средств программной инженерии. - М.: ЦНИИ информации и технико-экономических исследований по атомной науке и технике, 1988.

  9. В. Турский. Методология программирования. - М.: Мир, 1981.

  10. Г. Буч. Объектно-ориентированное проектирование с примерами применения. - М.: Конкорд, 1992.

  11. Е.А. Жоголев. Система программирования с использованием библиотеки подпрограмм / Система автоматизация программирования. - М.: Физматгиз, 1961. - С. 15-52.

  12. Ф.П. Брукс, мл. Как проектируются и создаются программные комплексы. - М.: Наука, 1979.

  13. R.C. Holt. Structure of computer programs: A Survey // Proceedings of the IEEE, 1975, 63(6). - P. 879-893.

  14. Дж. Хьюз, Дж. Мичтом. Структурный подход к программированию. - М.: Мир, 1980.

  15. Е.А. Жоголев. Технологические основы модульного программирования // Программирование, 1980, #2. - С. 44-49.

  16. Б. Боэм, Дж. Браун, Х. Каспар и др. Характеристики качества программного обеспечения. - М.: Мир, 1981.

  17. В.В. Липаев. Качество программного обеспечения. - М.: Финансы и статистика, 1983.

  18. Б. Шнейдерман. Психология программирования. - М.: Радио и связь, 1984.

  19. Revised version of DP9126 - Criteria of the evaluation of software quality characteristics. ISO TC97/SC7 #610. Part 6.

  20. В.Ш. Кауфман. Языки программирования. Концепции и принципы. - М.: Радио и связь, 1993.

  21. Требования и спецификации в разработке программ. - М.: Мир, 1984.

  22. В.Н. Агафонов. Спецификация программ: понятийные средства и их организация. - Новосибирск: Наука (Сибирское отделение), 1987.

  23. В.В. Липаев, Е.Н Филиппов. Мобильность программ и данных в открытых информационных системах. - М.: Научная книга, 1997.

  24. Шауцукова Л.3. Информатика: Учеб. пособие для 10 - 11 кл. общеобразоват. учреждений / Л.З. Шауцукова. – М.: Просвещение, 2000.

  25. Островейковский В.А. Информатика: Учебник для вузов. – М.: Высш. шк., 2000.

  26. Николаев В.И., Чалов Д.В., Сибирев В.Н. Информатика. Теоретические основы: Учеб. пособие. – СПб.: СЗТУ, 2002.

  27. ГОСТ 19.701–90 (ИСО 5807–85) «Единая система программной документа­ции».

  28. Белов М.П. Основы алгоритмизации в информационных системах: Учеб. пособие. – СПб, СЗТУ, 2003. – 85 с.

  29. Дж.Хьюз, Дж. Мичтом. Структурный подход к программированию. М.: Мир, 1980. - С. 29-71.

  30. В. Турский. Методология программирования. - М.: Мир, 1981. - С. 90-164.

  31. Е.А. Жоголев. Технологические основы модульного программирования // Программирование, 1980, #2. - С. 44-49.

  32. R.C. Holt. Structure of Computer Programs: A Survey // Proceedings of the IEEE, 1975, 63(6). - P. 879-893.

  33. Г. Майерс. Надежность программного обеспечения. М.: Мир, 1980. - С. 92-113.

  34. Я. Пайл. АДА - язык встроенных систем. М.: Финансы и статистика, 1984. - С. 67-75.

  35. М. Зелковец, А. Шоу, Дж. Гэннон. Принципы разработки программного обеспечения. М.: Мир, 1982. - С. 65-71.

  36. А.Л. Фуксман. Технологические аспекты создания программных систем. М.: Статистика, 1979. С. 79-94.