Нужно научиться использовать шаблоны классов в языке С++, получить представление о связных списках. Работа выполняется с использованием шаблона “Win32 Console Project” MS Visual Studio.NET.

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

Чтобы сгенерировать семейство родственных классов для работы с различными типами данных, необходимо объявить единственный шаблон класса. При объявлении шаблона класса можно использовать параметры типов и параметры-константы вместо конкретных типов или констант. При создании объекта на основе шаблона переопределяются значения параметров типов и пара¬метров-констант. Затем компилятор генерирует экземпляр версии класса, использующий указанные типы и константы.
Допустим, мы сконструировали класс для хранения списка 100 целочисленных значений. Базовое объявление класса может быть следующим:

class IntList
{
public:
IntList();
int SetItem (int Index, const int &Item);
int GetItem (int Index, int &Item);
private:
int Buffer [100];
};

Целочисленные значения хранятся в закрытом массиве Buffer, а специально написанный конструктор по умолчанию инициализирует нулями все элементы этого массива. Функции-члены SetItem() и GetItem() используются для присваивания или получения значений указанных элементов.
Допустим, нужно получить подобный класс для хранения списка вещественных значений, структур или большего количества элементов, например, 250. В этих случаях объявляется полностью новый класс. Создание производного класса от intList не является решением задачи, так как необходимо не просто добавить несколько новых свойств, а изменить основные типы или константы, на которых основывается построение класса.
При использовании обобщённого программирования можно написать единственный шаблон класса, который будет применяться для автоматической генерации целого семейства взаимосвязанных классов, предназначенных для хранения данных различных типов и различного числа элементов. Вот простая версия такого шаблона класса:

template class CList
{
public:
int SetItem (int Index, const T &Item);
int GetItem (int Index, T &Item);
private:
T Buffer[I];
};

В этом объявлении Т является параметром типа, а I — параметром – константой (точнее, в данном примере I — это параметр-константа типа int). Фактические значения для параметров Т и I устанавливаются при создании конкретного объекта класса.
В объявлении шаблона класса идентификатор I может использоваться как значение раз¬мерности массива, поскольку он является параметром-константой шаблона, а не обычным параметром или переменной, которые нельзя использовать для задания размерности массива, так как язык C++ не позволяет динамически изменять размерность массива во время выполнения программы. Использование параметра-константы допустимо на этапе компиляции, так как при запуске программы значение этого параметра становится константой.
В шаблон класса можно включать список из любого числа параметров, ограниченных символами “<” и “>”. Список в уголковых скобках должен содержать хотя бы один параметр.
Параметры - константы могут иметь любой допустимый тип; не обязательно int, как в приведенном выше примере. Внутри объявления класса параметр типа может находиться в любом месте программы, в котором допустимо использование спецификации типа, а параметр-константа - в любом месте программы, в котором допустимо применение константного выражения объявленного типа (в примере - int).
Функцию-член SetItem() можно определить следующим образом:

template int CList::SetItem(int Index, const T &Item)
{
if (Index < 0 || Index > I - 1)
return 0; // ошибка
Buffer[Index] = Item;
return 1; // успешное завершение
}

Здесь нужно обратить внимание, что функция возвращает значение 1 при удачном завершении и 0, если заданное значение индекса недопустимо.
Как показано в этом примере, определение функции, помещенное вне объявления шаблона класса, в дополнение к компонентам, обычно включаемым в определение функции-члена класса, должно содержать следующие два компонента:
1. Определение должно начинаться спецификатором template, за которым следует такой же список параметров в угловых скобках, как и в определении шаблона класса (в приведенном примере template ).
2. За именем класса, предшествующим операции расширения области видимости, должен следовать список имен параметров шаблона (в нашем примере — CList<Т, I>). Список используется для полного задания типа класса, к которому принадлежит функция.
Метод шаблона класса GetItem() можно по аналогии с SetItem() определить следующим образом:

template int CList::GetItem (int Index, T &Item)
{
if (Index < 0 || Index > I - 1)
return 0;
Item = Buffer[Index];
return 1;
}

Если вы хотите что-то дешево купить, то вам просто необходимы скидки ханты-мансийск, которые помогут вам съэкономить.