Лекция 16 - Шаблоны классов.ppt
- Количество слайдов: 14
Языки программирования Шаблоны классов Полежаев Петр Николаевич
Зачем создавать множество классов, различающихся только типом хранимых данных? class Stack 1 { int top; double st[100]; class Stack 2 { int top; char st[100]; public: Stack(): top(0){} void Push(double value) { st[top++] = value; } double Pop(){ return st[--top]; } bool Empty(){ return top == 0; } }; public: Stack(): top(0){} void Push(char value) { st[top++] = value; } char Pop(){ return st[--top]; } bool Empty(){ return top == 0; } };
Лучше создать шаблон класса template <class T> class Stack 1 { int top; T st[100]; public: Stack(): top(0){} void Push(T value) { st[top++] = value; } T Pop(){ return st[--top]; } bool Empty(){ return top == 0; } }; Stack<double> s 1; Stack<char> s 2; s 1. Push(1. 2); s 1. Push(-2. 5); s 1. Push(0. 33); s 2. Push('a'); s 2. Push('c'); s 2. Push('d'); while (!s 1. Empty()) cout << s 1. Pop() << " “; cout << endl; while (!s 2. Empty()) cout << s 2. Pop() << " “; cout << endl;
Синтаксис шаблона класса template <описание_параметров> определение_класса; Параметры шаблона перечисляются через запятую. В качестве параметров могут использоваться типы, шаблоны и переменные. При определении класса в соответствующие места вставляются параметры.
Пример template <class T, class C, class E = int> class My. Class { T Data; C func(E par 1, T par 2) { } …… };
Пример шаблона класса линейного списка template <class T> class List { //Внутренний класс узла class Node { public: T data; //Поле данных Node* next; //Указатель на следующий элемент Node* prev; //Указатель на предыдущий элемент //Конструктор по умолчанию Node(): next(NULL), prev(NULL) {} }; Node* beg; //Указатель на начало линейного списка public: ……… void Add. To. Begin(T value) { …… } void Remove. First() { …… } void Insert. At(int index, T value) { …… } void Remove. At(int index) { …… } bool Empty() { …… } T& operator [] (int index) { …… } void Print() { …… } }; см. проект List. Template решения Lec 16 Examples
Пример класса стека (с параметромразмером) template <class T, int MAX_SIZE = 100> class Stack 1 { int top; T st[MAX_SIZE]; public: Stack(): top(0){} void Push(T value) { st[top++] = value; } T Pop(){ return st[--top]; } bool Empty(){ return top == 0; } };
Инстанцирование – процесс создания экземпляра класса-шаблона при котором определяются значения всех его параметров Формат: имя_шаблона<аргументы> имя_объекта [(параметры_конструкт)]; Примеры: List<int> l 1; Stack<char, 200> st; Stack<double> Double. Stack;
Правила описания шаблонов класса • Шаблоны классов не могут быть виртуальными • Шаблоны классов могут содержать статические элементы, дружественные функции и классы • Шаблоны классов могут быть производными как от шаблонов, так и от обычных классов • Внутри шаблона нельзя определять friendшаблоны
Если метод описывается вне класса, то используется следующий синтаксис template <описание_параметров> возвращаемый_тип имя_класса<парам_шаблона>: : имя_метода(список_параметров) { /*код метода*/ }
Пример template <class T> class Stack { int top; T st[MAX_SIZE]; public: Stack(): top(0) {} void Push(T value); T Pop(); bool Empty(); }; //Методы, описанные вне класса Stack template <class T> void Stack<T>: : Push(T value) { st[top++] = value; } template <class T> T Stack<T>: : Pop() { return st[--top]; } template <class T> bool Stack<T>: : Empty() { return top == 0; }
Домашнее задание • Законспектировать (с примерами) подтемы «Специализация метода шаблона класса» и «Специализация шаблона класса»
Задание для самостоятельной работы • Самостоятельно более глубоко изучить главу 6 «Шаблоны классов» (см. Павловская "Программирование на языке высокого уровня", с. 211 – 221)
Вопросы? • Q&A
Лекция 16 - Шаблоны классов.ppt