Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать неотразимый комплимент Как противостоять манипуляциям мужчин? Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?

Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Шаблоны классов





Аналогично шаблонам функций. определяется шаблон семейства классов:

 

template <список_параметров_шаблона> определение_класса

 

Шаблон семейства классов определяет способ построения отдельных классов подобно тому, как класс определяет правила построения и формат отдельных объектов. В определении класса, входящего в шаблон, особую роль играет имя класса. Оно является не именем отдельного класса, а параметризованным именем семейства классов.

Как и для шаблонов функций, определение шаблона класса может быть только глобальным.

 

имя_параметризованного_класса <фактические_параметры_шаблона>

имя_объекта (параметры_конструктора);

 

Классическим примером шаблонов классов являются контейнерные классы (т.е. классы, содержащие типы), например множества. Используя шаблон, можно создавать родовой класс для множеств, после чего порождать конкретные множества - цветов, строк и т.д.

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

Пример:

 

template <class T>

class Pair

{

T a, b;

public:

Pair (T t1, T t2);

T Max();

T Min ();

int isEqual ();

};

 

Пока все выглядит также изящно, как и для шаблонов функций. Единственная разница состоит в том, что вместо описания функции используется объявление класса. Шаблоны классов становятся все более сложными, когда вы описываете принадлежащие функции класса. Вот, например, описание принадлежащей функции Min() класса Pair:

 

template <class T>

T Pair <T>::Min()

{

return a < b ? a : b;

}

 

Чтобы понять эту запись, давайте вернемся немного назад. Если бы Pair был обычным классом (а не шаблоном класса) и T был бы некоторым конкретным типом, то функция Min класса Pair была бы описана таким образом:



 

T Pair::Min()

{

return a < b ? a : b;

}

 

Для случая шаблонной версии нам необходимо, во-первых, добавить заголовок шаблона template <class T> Затем нужно дать имя классу. Помните, что на самом деле мы описываем множество классов - семейство Pair. Повторяя синтаксис префикса (заголовка) шаблона, экземпляр класса Pair для целых типов, можно назвать Pair<int>, экземпляр для типа double - Pair<double>, для типа Vector - Pair<Vector>. Однако в описании принадлежащей функции нам необходимо использовать имя класса Pair<T>. Это имеет смысл, так как заголовок шаблона говорит, что Т означает имя любого типа. Приведем текст остальных методов класса Pair. Описания методов помещаются в заголовочный файл, так как они должна быть видимы везде, где используется класс Pair.

 

// конструктор

template <class T>

Pair <T>::Pair (T t1, T t2) : a(t1), b(t2)

{}

// метод Max template <class T>

T Pair <T>::Max()

{

return a>b ? a : b;

}

// метод isEqual template <class T>

int Pair <T>::isEqual()

{

if (a==b) return 1;

return 0;

}

 

Ранее уже отмечалось, что шаблоны функций могут работать только для тех (встроенных) типов данных или классов, которые поддерживают необходимые операции. То же самое справедливо и для шаблонов классов. Чтобы создать экземпляр класса Pair для некоторого классового типа, например для класса X, этот класс должен содержать следующие общедоступные функции

 

X (X &); // конструктор копирования

int operator == (X)

int operator < (X);

 

Три указанные функции необходимы, так как они реализуют операции, выполняемые над объектами типа T в метода шаблона класса Pair.

Наследование в шаблонах классов

Шаблоны классов, как и классы, поддерживают механизм наследования. Все основные идеи наследования при этом остаются неизменными, что позволяет построить иерархическую структуру шаблонов, аналогичную иерархии классов.

Приведем совершенно тривиальный пример, на котором продемонстрируем, каким образом можно создать шаблон класса, производный из нашего шаблона класса Pair. Пусть это будет класс Trio, в котором к паре элементов a и b из Pair, добавим еще один c.

 

template <class T>

class Trio: public Pair <T>

{

T c;

public:

Trio (T t1, T t2, T t3);

...

};

template <class T>

Trio<T>::Trio (T t1, T t2, T t3): Pair <T> (t1, t2), c(t3)

// Заметьте, что вызов родительского конструктора

// также сопровождается передачей типа Т в качестве параметра.

{}

 








Date: 2015-12-12; view: 82; Нарушение авторских прав

mydocx.ru - 2015-2018 year. (0.01 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию