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

Конкретизація шаблону класу

Процес побудови породженого класу компілятором називають конкретизацією шаблонного класу. Шаблонний клас конкретизується приєднанням до його імені повного списку фактичних параметрів, які вкладаються в кутові дужки. При цьому компілятор створює породжений клас, в якому:

  • кожен параметр типу class Tі замінюється ім’ям дійсного типу;

  • кожен параметр типу Typei ідентi замінюється константним виразом.

Фактичні аргументи для нетипових параметрів повинні обчислюватися на стадії компіляції, оскільки саме на цій стадії проводиться конкретизація шаблонних класів.

Спеціалізація шаблонів класів

Можна спеціалізувати шаблонний клас для деяких значень параметризованих типів, передбачивши для цих випадків окрему реалізацію деяких функцій-членів. Розглянемо приклад:

#include <iostream>

#define SIZE 10

using namespace std;

template <typename T>

class Stack

{

T stack[SIZE];

int top;

public:

Stack(){top = 0;}

void push(T item);

T pop();

};

//Запис елемента в стек

template <typename T>

void Stack<T>:: push(T item)

{

if (top >= SIZE)

{

cout << "\nСтек повний\n";

return;

}

stack[top] = item;

top++;

}

//Видалення елемента із стеку

template <typename Т>

T Stack<T>::pop()

{

if (top <= 0)

{

cout << "\nСтек порожній\n";

return 0;

}

top--;

return stack[top];

}

//Спеціалізація функції-члена

//для T = char

void Stack<char>::push(char item)

{

if (top >= SIZE-1)

{

cout << "\nСтек повний\n";

return;

}

stack[top] = item;

top++;

}

int main()

{

Stack<int> stl;

Stack<char> st2;

int i;

//Розміщення елементів в стеки

for (i=0;i<8;i++)

{

stl.push(i+l);

st2.push(char(‘A’ + i));

}

cout « "Із стеку stl видалені:\n";

for (i=0;i<8;i++)

cout << stl.pop() << ‘ ’;

cout << endl;

cout << "Із стеку st2 видалені:\n";

for (i=0;i<8;i++)

cout << st2.pop() <<’ ’;

return 0;

}

У розглянутому прикладі створюються два стеки: стек цілих чисел і стек символів. Для стеку символів функція-член push() класу Stack спеціалізується. При виконанні програма виводить на екран:

Із стеку stl видалені:

8 7 6 5 4 3 2 1

Із стека st2 видалені:

H G F E D C B A

Статичні члени шаблонного классу

У шаблонному класі можна оголошувати статистичні дані-члени. В цьому випадку для кожної конкретизації шаблонного класу буде побудована своя сукупність статичних даних-членів. Розглянемо приклад:

template <class Т>

class Queue

{

//закриті члени класу

static int* р;

public:

Queue();

static Queue* Free();

};

//Ініціалізація статичного даного-члена

template <class T>

int Queue<T>::p =10;

Можна визначити і спеціалізацію статичного даного-члена:

int Queue <char *> :: р = 1024;

Для статичних даних-членів звичайного класу пам’ять виділяється відразу після визначення класу. Для статичних даних-членів шаблонного класу пам’ять виділяється при кожній конкретизації класу. Доступ до статичного члену шаблонного класу здійснюється через конкретизацію цього класу.

int n = Queue <string> :: p;

int m = Queue <char*> :: p;