Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мини конспект по ООП.doc
Скачиваний:
34
Добавлен:
25.03.2015
Размер:
241.66 Кб
Скачать

39. Класс-шаблон. Общая форма класса-шаблона и экземпляра такого класса?

Классы-шаблоныполезны тогда, когда класс содержит логику, допускающую значительные обобщения.

Общая форма объявления класса-шаблона имеет следующий вид:

template <class параметр-тип> class имя_класса

{

. . . // тело класса

}

Где параметр-тип– это параметр-тип, который указывается при создании экземпляра класса.

После создания класса-шаблона можно создать конкретный экземпляр этого класса, используя следующую общую форму:

имя_класса <тип> объект;

Где тип – это имя типа данных, с которым будет оперировать данный класс.

Например, создадим класс-шаблон, реализующий стандартный стек "последним вошел– первым вышел". Он может использоваться для реализации стека с произвольным типом данных.

#include<iostream.h>

#include<conio.h>

// создание класса-шаблона stack

template <class Stack_Type> class stack

{

Stack_Type stck[100];

int tos;

public:

stack();

~stack();

void push(Stack_Type i);

Stack_Type pop();

};

//функция-конструктор stack

template <class Stack_Type> stack<Stack_Type>::stack()

{

tos=0;

cout<<"Стек создан\n";

}

// функция-деструктор stack (в данном примере деструктор не реализуется)

template <class Stack_Type> stack<Stack_Type>::~stack()

{

cout<<"Стек уничтожен\n";

}

// помещение объекта в стек

template <class Stack_Type> void stack<Stack_Type>::push(Stack_Type i)

{

if (tos==100)

{

cout<<"Стек полон.\n";

return;

}

stck[tos]=i;

tos++;

}

// Извлечение объекта из стека

template <class Stack_Type> Stack_Type stack<Stack_Type>::pop()

{

if (tos==0)

{

cout<<"Стек пуст.\n";

return 0;

}

tos--;

return stck[tos];

}

int main()

{

clrscr();

stack<int> a; // создание стека типа int

stack<double> b; // создание стека типа double

stack<char> c; // создание стека типа char

int i;

// демонстрация работы целого и вещественного стеков

a.push(1);

b.push(99.3);

a.push(2);

b.push(-12.23);

cout<<a.pop()<<" "<<a.pop()<<" ";

cout<<b.pop()<<" "<<b.pop()<<"\n";

//демонстрация работы символьного стека

for (i=0; i<10; i++) c.push((char) 'A'+i);

for (i=0; i<10; i++) cout<<c.pop();

cout<<"\n";

return 0;

}

Объявление класса-шаблона похоже на объявление функции-шаблона. При объявлении конкретного экземпляра созданного класса-шаблона (в данном примере stack) компилятор автоматически генерирует все необходимые функции и данные для обработки фактических данных.

Можно создать стек, содержащий определенный тип данных.

Например, можно хранить адреса, используя следующую структуру:

struct address

{

char name[40];

char street[40];

char city[30];

}

Затем можно использовать класс stack(из предыдущего примера) для создания стека, в котором хранятся объекты типаaddress:

stack<address> obj;

Класс-шаблон может иметь несколько типов-шаблонов, объявленных в виде списка, разделенного запятыми.

Например:

// в данном примере используется два шаблона при определении класса

#include <iostream.h>

#include <conio.h>

template <class Type1, class Type2> class myclass

{

Type1 i;

Type2 j;

public:

myclass(Type1 a, Type2 b)

{

i=a;

j=b;

}

void show()

{

cout<<i<<" "<<j<<"\n";

}

};

int main()

{

clrscr();

myclass<int, double> ob1(10, 0.25);

myclass<char, char *> ob2('X', "Это – тест");

ob1.show(); // вывод int и double

ob2.show(); // вывод char и char *

return 0;

}

В программе объявляются два типа объектов ob1 иob2.

Объект ob1 использует типы данныхint и double, объектob2 –char и char *.

В обоих случаях компилятор автоматически генерирует необходимые данные и функции в соответствии с типом данных, которые передаются конструктору в качестве аргументов.