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

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

}

69.Механизм обработки исключений.

Механизм обработки исключений в языке С++

Этот механизм очень похож на соответствующий механизм, существующий в Borland Delphi. Общий вид обработчика исключений следующий:

try

{<Операторы контролируемого блока.>}

catch (<Спецификация исключения 1.>)

{<Операторы 1-го обработчика исключений.>}

. . . .

catch (<Спецификация исключения N.>)

{< Операторы N-го обработчика исключений.>} ,

где спецификация исключения определяет тип исключения и может иметь один из трех видов:

<тип> <имя> - эта конструкция напоминает описание формального параметра в определении функции. Имя параметра используется в операторах обработки исключений. С его помощью передается информация из обрабатываемого исключения;

<тип> - этот вариант не предполагает использования значения исключения. Для обработчика важен только его тип;

… - в этом случае (многоточие) обработчик реагирует на любое исключение независимо от типа. Так как сравнение посланного исключения с типами обработчиков выполняется последовательно, то обработчик с многоточием в качестве спецификации нужно помещать только в конце списка обработчиков. В противном случае он "перехватит" все возникающие исключения.