|
Программирование >> Программирование на языке c++
обходимо явно определить ее, например, путем явного описания функции swap(array<char*>& my array): void swap(array<char*>& my array) { int size=my array.size; for(int i=0,j=size-1;i<j;i-< <-,j~) if (strcmp(my array[i],niy array{j])<0) ****♦ { char* temp = my array[j]; my array[jj = my array[i]; my array[i] = temp; } Строка с изменениями в программе отмечена знаками ****♦ (будем использовать их и далее, чтобы сконцентрировать внимание на изменениях). Рассмотрим другие способы описания аналогичных операций. Изменим функцию swap следующим образом: template<class Туре> void swap (comparable array<Type>& my array) { int size=my array.size; for(int i=0,j=size-1;i<j;i-H+,j-) if (my array.iess than(my array[i],my array[j])) /***** { Type temp = my array[j]; my arrayj] = my array[i]; my array[i] = temp; } Здесь мы будем рассматривать только те массивы, которые можно сравнивать, они названы comparable array. Ссылка на такой массив и передается в функцию swap. Определим этот массив так (рис. 6.2): template<class Туре> class comparable array : public array<Type>, public comp<Type> { public: comparable array(int n) : array<Type>(n) { } это конструктор (напомним, что n - число элементов массива) Базовый класс класс array определяет интерфейс с массивом, то есть описывает операцию обращения к массиву и получение значения его элемента (см. функцию operatorQ ) Класс comp определяет действия, которые необходимо выполнить для сравнения элементов массива array (см. фу1гкцию less than) Шаблон (template) для класса comparable array Производный класс Рис. 6.2. Иерархия классов к примеру Здесь класс сошр должен иметь функцию, которая выполняет соответствующее сравнение. Его можно определить, например, так: template<class Туре> class comp { public: static less than(Type& x,Type& y) { return x<y; } Для тех типов данных, для которых операция сравнения не определена, можно описать соответствующие версии класса comp, например: class comp<char*> { public: static less than(const char* x,const char* y) { return strcmp{x,y)<0; } Теперь можно привести текст некоторой законченной программы: #include <iostream.h> #include <string.h> #include array.h здесь содержится описание класса array (см. §6.1) template<class Туре> class comp { public: static less than(Type& x,Type& y) { return x<y; } class comp<char*> { эта версия должна быть описана public: перед ее использованием static less than{const char* x.const char* у) { return strcmp(x,y)<0; } template<class Type> class comparable array : public array<Type>, public comp<Type> { public: comparable array(int n) : array<Type>{n) { } template<class Type> void swap(comparable array<Type>& my array) { int size=my array.size; for{int i=0,j=size-T;i<j;i++,j-) if (my array.less than(my array[i],my array[j])) { Type temp = my array[j]; my array[j] = my array[i]; my array[i] = temp; void main(void) { comparable array<char> my array(10); comparable array<char*> my array1(5); my array1[0] = aa ; my array1[1] = bb ; my array1[2] = cc ; my array1[3] = bb ; my array1[4] = dd ; for (int j=0;j<10;j++) cin my arrayj]; swap(my array); swap(my array1); for (j=0;j<10;j++) cout << my array[j]; cout endl;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |