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


Полезное:

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


Категории:

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






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





n Шаблон класса имеет вид:

 

template <список параметров>
class объявление_класса

n Список параметров класса-шаблона аналогичен списку параметров функции-шаблона: список классов и переменных, которые подставляются в объявление класса при генерации конкретного класса.

n Очень часто шаблоны используются для создания коллекций ( классов, которые представляют собой набор объектов одного и того же типа).

n Простейшим примером коллекции может служить массив.

n У массива имеется ряд существенных недостатков:

1) необходимость задавать размер массива при его определении

2) отсутствие контроля использования значений индексов при обращении к атрибутам массива.

n Пример. При помощи шаблонов устранить два отмеченных недостатка у одномерного массива. При этом по возможности необходимо сохранить синтаксис обращения к атрибутам массива.

n Пусть новая структура данных vector. Тогда

template <class T>
class vector
{
public:
vector(): nItem(0), items(0) {};
~vector() { delete items; };
void insert(const T& t)
{ T* tmp = items;
items = new T[nItem + 1];
memcpy(items, tmp, sizeof(T)* nItem);
items[nItem++] = t;
delete tmp; }

void remove(void)
{ T* tmp = items;
items = new T[--nItem];
memcpy(items, tmp, sizeof(T) * nItem);
delete tmp;
}
const T& operator[](int index) const
{
if ((index < 0) || (index >= nItem))
throw IndexOutOfRange;
return items[index];
}
T& operator[](int index)
{
if ((index < 0) || (index >= nItem))
throw IndexOutOfRange;
return items[index];
}
private:
T* items;
int nItem;
};

n Кроме конструктора и деструктора, у нашего вектора есть только три метода: метод insert добавляет в конец вектора новый элемент, увеличивая длину вектора на единицу, метод remove удаляет последний элемент вектора, уменьшая его длину на единицу, и операция [ ] обращается к n-ому элементу вектора.

vector<int> IntVector;
IntVector.insert(2);
IntVector.insert(3);
IntVector.insert(25);
// получили вектор из трех атрибутов:
// 2, 3 и 25
// переменная x получает значение 3
int x = IntVector[1];
// произойдет исключительная ситуация
int y = IntVector[4];
// изменить значение второго атрибута вектора.
IntVector[1] = 5;

n Если операция [ ] используется справа от операции присваивания (в первых двух присваиваниях), то используется ее константный вариант, если слева (в последнем присваивании) – неконстантный.

n Использование операции индексирования [ ] слева от операции присваивания означает, что значение объекта изменяется, соответственно, нужна неконстантная операция.

n Параметр шаблона vector – любой тип, у которого определены операция присваивания и стандартный конструктор.

n Так же, как и с функциями-шаблонами, при задании первого объекта типа vector<int> автоматически происходит генерация конкретного класса из шаблона.

n Если далее в программе будет использоваться вектор вещественных чисел или строк, значит, будут сгенерированы конкретные классы и для них.

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

 

 

Date: 2015-11-15; view: 260; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



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