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

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


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] не определена для некоторых типов, например для строк. Поэтому не-



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

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