|
Программирование >> Программирование на языке c++
int operator-() const { return (int){sp-top); } размер стека class student { int age; char name[20]; public: studentO {} student(char nm[],int a) : age(a) { strncpy(name,nm,20); } void displayO { cout age \t name endl; } другие функции template <class S> void f(S s) в функцию f передается тип S в виде параметра (s - это объект типа S) { while(-s) (-s).displayO; } унарный оператор - был доопределен void mai п(void) { STACK<student> ss(3); student s1( Julja ,20), s2( Tanja ,42), s3( Olja ,39); ss+=s1; ss+=s2; ss+=s3; f(ss); вывод 3 строк, рассмотренных } во второй программе § 6.1 Здесь дополнительно переопределен унарный оператор -, который позволяет вычислить число элементов в стеке. Поэтому цикл while(-s) (-s).display() будет выполняться до тех пор, пока стек не станет пустым (он выполняется, пока -s не ноль, т. е. в стеке есть объекты). Выражение template <class S> void f(S s) задает шаблон для функции f. Теперь s - это объект типа S, и сам тип S передается в функцию f в виде параметра. Второй пример показывает использование шаблонов для двух функций: f и ff. Шаблон для класса array (массив) рассматривался и пояснялся в § 6.1. Ниже в него добавляется функция operator-() для доопределения унарного оператора -. Теперь этот оператор позволяет вернуть число элементов массива. #include <iostream.h> template <class T> class array { T*ar; int size; public: array(int n) { ar = new T[size=n]; } конструктор -arrayO { delete[] ar; } деструктор T& operator[](int x) { return ar[x]; } int operator-() { return size; } доопределение унар- }; ного оператора -template <class A.class T> void f(A& a,T t) шаблон для функции f { int m=-a; for{int i=0;i<m;i++) a[i] = t; } template <class A> void ff(A a) шаблон для функции ff { int m=-a; for{int i=0;i<m;i++) cout a[i] V; cout endl; } void main(void) { array<double> ad(4); массив объектов типа double array<char> ac(3); массив символов f(ad,1.234); запись во все элементы ad значения 1.234 ff(ad); Результат: 1.234 1.234 1.234 1.234 f(ac,$); запись во все элементы ас значения $ ff(ac); Результат: $ $ $ Здесь шаблон template <class A,class Т> void f(A& а,Т t) задает параметры А и Т для функции f. В результате объект а имеет тип А, объект t имеет тип Т, и эти типы (А и Т) передаются в функцию f в виде параметров. Функция ff имеет аргумент а типа А, и тип А тоже передается в функцию f в виде параметра. Функция f заполняет массив, полученный в виде первого параметра, значением, полученным в виде второго парамет- ра. Функция f выводит на экран значения всех элементов массива, полученного в виде параметра. 6.3. Методы использования шаблонов Построим функцию, которая будет выполнять некоторые операции с элементами массива, заданного в виде параметра (здесь использованы основные идеи примера, приведенного в [1, с. 271-277]). Опишем выполняемые операции. Пусть i - указатель на первый и j - указатель на последний элементы массива my array. Если значение my array[i] меньше, чем значение my array[j], то поменяем i-й и j-й элементы местами. Далее рассмотрим i+1-й и j-1-й элементы и выполним аналогичные действия. Будем повторять эти действия до тех пор, пока не достигнем центра массива (среднего элемента в массиве). Таким образом, массив {1,2,3,4,5,2,3,4,5,6} после выполнения рассмотренных действий будет представлен в виде: {6,5,4,4,5,2,3,3,2,1}. Это чисто абстрактная задача, но она простая, и на ее примере можно легко показать различные приемы использования шаблонов. Назовем нашу функцию swap (обмен). Она может быть представлена в следующем виде: template<class Туре> void swap(array<Type>& my array) { int size=my array.size; for(int i=0,j=size-1 ;i<j;i++,j~) if (my array[i]<my array[j]) { Type temp = my array[j]; my array[j] = my array[i]; my array[i] = temp; Единственным параметром функции swap является ссылка my array на массив типа Туре: swap(array<Type>& my array). Шаблон для массива типа Туре был представлен в § 6.1. Опять же здесь возникает проблема, когда операция < (меньше, чем) в выражении my array[i]<my array[j] не определена для некоторых типов, например для строк. Поэтому не-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |