|
Программирование >> Программирование на языке c++
cout << my arrayO]; cout endl; for (j=0;j<5;j++) cout niy array1[j]; cout endl; } Преимущество этой программы заключается в том, что мы отделили ту ее часть, которая обрабатывает массив (функция swap), от другой части, которая выполняет стандартные и новые операции сравнения элементов массива (функция !ess than класса comp). О преимуществах такого отделения еще будет говориться в § 6.6. В последнем примере мы имеем некоторую подразумеваемую взаимосвязь между функцией swap и классом сотр. Это не всегда хорошо. Однако мы можем включить функцию swap в некоторый класс (назовем его SWAP), для которого указанную выше взаимосвязь можно описать явно, например: template<class Type,class СОМР> class SWAP { public: static void swap(array<Type>&); template<class Type,class COMP> void SWAP<Type,COMP>::swap(array<Type>& niy array) { int size=my array.size; for(int i=0,j=size-1;i<j;i-l-l-,j-) if (COMP::less than(my array[i],my array[j])) { Type temp = my arrayj]; my array[j] = my array[i]; my array[i] = temp; Изменим теперь нашу функцию main: void main(void) { array<int> my array(10); array<char*> my array1(5); my array1[0] = aa ; my array1[1] = bb ; my array1[2] = сс ; my array1[3] = bb ; my array1[4] = dd ; for (int j=0;j<10;j++) cin >> my array[j]; ниже следует обращать внимание на пробелы между расположенными рядом знаками > >. В противном слу- чае знак (без пробела) воспринимается компилятором как оператор сдвига вправо, а это ошибка SWAP<int,comp<int> >::swap(my array); SWAP<char*,comp<char*> >:;swap(my array1); for (j=0;j<10;j++) cout << niy array[j]; cout endl; for (j=0;j<5;j++) cout << my array1[j]; cout endl; } Этот пример показывает, как строить программы, составленные из нескольких относительно независимых частей, которыми, в данном случае, являются класс comp и функция swap. 6.4. Переопределение шаблонов функций Пусть задан шаблон функции function в виде: template<class Туре> Туре function(Type); При этом принятые в языках CIC++ стандартные правила преобразования типов аргументов не могут быть использованы для аргументов шаблона функции. Однако возвращаемый результат может быть автоматически преобразован к совместимому типу в соответствии с существующими правилами. Рассмотрим пример: void mai п(void) { int i; char с; float f; float f 1=function(i); function(int) float f2=function(c); function(char) float f3=function(f); function{float) Здесь каждая функция (см. комментарии к программе) строится из ее шаблона в соответствии с действительным типом ее аргумента. Если для заданного аргумента типа int нужно вызвать функцию function(float), то необходимо явно описать соответствующее преобразование, например: float f4=function(float(i)); function(float) Функция-шаблон может быть переопределена в следующих случаях: > если есть другие функции с тем же именем; > если есть другие функции-шаблоны с тем же именем. Выбор конкретной функции выполняется в такой последовательности: есть полное соответствие между числом и типами аргументов в вызове и описании функции (см. пример, приведенный в § 6.2, где используются вызов max(strl ,str2) и описание max(cliar*,char*) функции max для сравнения строк). Если находится подходящая функция, то она вызывается; -4 есть полное соответствие между числом и типами аргументов в вызове и описании функции, которая может быть построена из заданного шаблона (здесь тоже можно сослаться на пример из § 6.2, где в соответствии с вызовами max(a,b) и max(c,d) по шаблону Туре тах(Туре, Туре) могут быть сгенерированы функции int max(int,int) и char max(char,char)). Если находится подходящая функция, то она вызывается; > если можно применить обычные правила переопределения функций, например, заданы описания char* max (char*,char*), river max(river,river), где river - река, и вызов max(Vouga,Svisloch), где Vouga (река в Португалии) и Svisloch (река в Беларуси) - объекты класса river. Если находится подходящая функция, то она вызывается.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |