Обобщенные классы

ПРАКТИЧНЕ ЗАНЯТТЯ №12

Тема: Шаблоны (templates). Шаблонні класи на мові C++

Мета: навчититись створювати шаблонні функції та првцювати з ними

Обладнання: Персональні комп’ютери

ТЕОРЕТИЧНІ ВІДОМОСТІ

Шаблонные классы

В общем-то шаблонные классы создаются почти так же как и шаблонные функции - перед именем класса записывается ключевое слово template. Шаблонные классы рассмотрим на примере стека:

ПРИМЕР 1

template <class Type>class stack { private: int top; Type s[10]; public: stack (): top(0) {} void push(Type var) { top++; s[top] = var; } Type pop();}; template <class Type>Type stack<Type>::pop(){ Type var = s[top]; top--; return var;}

Здесь мы определили стек из десяти элементов. Эти элементы могут быть какого угодно типа, об этом чуть-чуть ниже.

Единственное на что необходимо обратить ваше внимание: определение функций push и pop. Функция push определена внутри класса, а функция pop - снаружи. Для всех функции объявлённых за пределами класса, нужно обязательно указывать ключевое слово template. Выражение перед именем функции совпадает с тем, которое указывается перед именем класса.

Теперь посмотрим как работать с шаблонными классами:

stack<int> s1;stack<float> s2;s1.push(3);s1.push(2);s1.pop();s2.push(0.5);

При создании объекта, после имени класса нужно поставить угловые скобки, в которых указать нужный тип. После этого объекты используются так, как мы привыкли.

У шаблонных классов есть одна потрясающая особенность - кроме стандартных типов, они могут работать и с пользовательскими. Рассмотрим небольшой пример. Для этого определим простой класс warrior:

class warrior{ public: int health; warrior (): health(0) {}};stack<warrior> s;warrior w1;warrior w2;warrior w3;s.push(w1);s.push(w3);s.pop();s.push(w2);

Теперь в стеках можно размещать переменные типа warrior!!! Это очень удобно, когда на основе списков мы будем создавать графы и деревья.

Далее рассмотрим пример двух родовых типа данных

#include <iostream>

using namespace std;

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'; }

};

void main()

{

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

myclass<char, char *> ob2('X', "Это проверка");

ob1.show(); // вывод значений типа int и double

ob2.show(); // вывод значений типа char и char *

system("pause");

}

Обобщенные классы

ПРИМЕР 2


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: