Программирование >>  Программирование на языке c++ 

1 ... 77 78 79 [ 80 ] 81 82 83 ... 159


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. Если находится подходящая функция, то она вызывается.



1 ... 77 78 79 [ 80 ] 81 82 83 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика