ПРАКТИЧНЕ ЗАНЯТТЯ №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