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

1 ... 75 76 77 [ 78 ] 79 80 81 ... 159


обходимо явно определить ее, например, путем явного описания функции 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;



1 ... 75 76 77 [ 78 ] 79 80 81 ... 159

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