logo
шпоры по ООП

54.Шаблон класса.

Если рассматривать класс как некое обрамление данных, выполняющее различные операции над данными, то можно изолировать типы данных и классы друг от друга, заставляя класс работать с обобщённым типом T. Подобный класс называется шаблоном класса (описание класса) и используется компилятором для создания реального класса. Объявление начинается с template, после которого следует <class T>.

Простые шаблоны

template <class T> class List{

public:

List();

void add(T&);

void remove(T&);

void detach(T& t){remove(t);}

~List();

};

template <class T> List <T>::List() {...}

template <class T> void List <T>::add(T&) {...}

template <class T> void List <T>::remove(T&){...}

template <class T> List <T>::~List(){...}

void main(){

List <long> phone_numbers; //Создание шаблонного класса

List <char* > club_members;

static lon number=5551000;

phone_numbrs.add(number);

static char* name=”Michael”;

club_members.add(name);

}

Вложенные шаблоны

Шаблонные классы могут быть вложенными. Такие классы иногда называют контейнерными, задача которых управлять группами объектов. Шаблоны могут быть с несколькими обобщёнными аргументами. Для одного и того же класса можно объявить как обобщённые так и типизированные аргументы.

template <class First, int i, class Second, char* name>

class A{public A();...};

Шаблона класса можно объявить дружественными другому классу.

template <class A>

class Small{friend class Large <R>};public: Small();...};

template <class A>

class Large {public:Large();...};}

и любой шаблонный класс типа Large <A> будет дружественным Small <A>. Так определяется отношение дружественности для целого семейства классов.

Шаблон класса с несколькими аргументами

#include <stdlib.h>

template <class T, int i, long L>

class MyClass{

T* object;

long offset;

int size, length;

public:

MyClass(); MyClass(int(); int Foo (long);

};

template < class T, int i, long L >

MyClass <T,i,L>::MyClass(){

offset=L; //Переменная объявлена в шаблоне класса

size=i; // Переменная объявлена в функции-члене

object=new T(); // Переменная объявлена и в шаблоне класса и в функции-члене

}

template < class T, int i, long L >

MyClass <T,i,L>::MyClass(int x){

length=i; offset=L; //Присваивание аргументов шаблона private переменным

size=x; // Используется аргумент функции

object=new T (); //Использование аргумента шаблона класса

}

template < class T, int a, long L >

int MyClass <T,a,L>::Foo(long value){ return (value& 0xFF);}

class List();

void main(){

MyClass <int,5, 100 > x (2);

MyClass <float, 100,200 > y (3);

MyClass <List, 100,300 > z ();

}