Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

11.2.2 Константи та типи як параметри шаблону

Як згадувалося вище , параметри шаблона класу можуть бути або типами, або константами. Розглянемо приклад, коли параметрами виступають константи.

template <int size>

class MemBlock

{

public:

MemBlock()

{

p= new char[ size ];

}

~MemBlock()

{

delete p;

}

operator char* ();

protected:

char *p;

};

template <class T, int numElements>

class TypeBlock

{

public:

TypeBock();

~TypeBlock();

operator T* ();

protected:

T* p;

}

template <class T, int numElements>

TypeBlock<T, numElements>::TypeBlock()

{

p= new T[numElements];

}

template <class T, int numElements>

TypeBlock<T, numElements>::~TypeBlock()

{

delete [ ] p;

}

template <class T, int numElements>

typeBlock<T, numElements>::operator T*()

{

return p;

}

Як i класи, шаблони можуть мiстити статичнi елементи даних, статичнi елементи-функцiї, дружнi функцiї та класи. Не можна визначати внутрiшнiй шаблон в тiлi iншого шаблона класу. Однак, можна оголосити iнший внутрiшнiй клас, який використовує один чи декiлька параметрiв шаблона.

11.2.3 Використання шаблонних класів

Щоб створити представник шаблонного класу, можна просто вказати iм'я шаблона з списком аргументiв, якi помiщенi в дужки , в якостi специфiкатора типу. Список аргументiв шаблона модифiкується наступним чином:

-кожний аргумент, який має вигляд 'class iдентифiкатор' (параметр типу), замiнюється iменем дiйсного типу;

-кожний аргумент, що має вигляд 'iм'я_типу iдентифiкатор' (нетиповий

параметр), замiнюється константним виразом.

Приклад:

TStack<int> stckInt1;

TStack<int> stckInt2( 40 );

TStack<long> *pstckLnd[10];

TStack<double> dblStk[10];

TStack<string> strStk;

int (TStack<unsigned>::*mf)( long );

extern TStack<char*> cStck;

extern TStack<char*> *pcStck;

void InitpcStck()

{

pcStck = new TStack<char*>(20);

}

Створивши представник шаблона класу, можна працювати з ним аналогiчно, як з екземпляром звичайного класу.

Приклад:

int main( void )

{

Tstack<int> Stack0fInt( 10 );

Stack0fInt.push( 33 );

Stack0fInt.push( 44 );

Stack0fInt.push( 55 );

cout << "помiщенi значення рiвнi: "

<< Stack0fInt.pop() << ','

<< Stack0fInt.pop() << ','

<< Stack0fInt.pop() << end1;

TStack<double> StackofDouble( 10 );

Stack0fDouble.push( 2.3456 );

Stack0fDouble.push( 4.8967 );

Stack0fDouble.push( -1.345 );

cout << "помiщенi значення рiвнi: "

<< Stack0fDouble.pop() << ','

<< Stack0fDouble.pop() << ','

<< Stack0fDouble.pop() << end1;

return 0;

}

До шаблоного класу можна застосувати ключове слово typedef, щоб спротити його використання.

Наприклад,

TStack<long> lstsk;

TStack<long> *plstck;

TStack<long> alstck[10];

можна спростити до

type TStack<long> LStack;

LStack lstck;

LStack *plstck;

LStack alstck[10];