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::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);
|