Пример кода программы на языке C++, иллюстрирующий применение шаблонов
В качестве примера приведем текст программы, реализующей шаблон класса сортировки элементов массива по возрастанию и специализирующей созданный шаблон для типа char. Программа состоит из двух модулей:
- «main.cpp» - содержит функцию main – точку входа в программу;
- «SortClass.h» - объявление шаблона класса CSort, реализующего сортировку массива по возрастанию его элементов.
Файл «SortClass.h».
#ifndef SORTCLASS_H
#define SORTCLASS_H
/*
Объявляем шаблон класса CSort для сортировки массива
по возрастанию его элементов
*/
template <class T>
class CSort
{
private:
T size; //Переменная для хранения
//числа элементов в массиве
T *array; //Указатель на область памяти,
//которая будет динамически
//распределена под массив
public:
CSort(): size(0), array(NULL) {}; //конструктор без
bool Test_Mas(); //проверка на существование массива
};
//конструктор класса CSort
template <class T>
CSort<T>::CSort(int newSize, T *newArray)
{
//newSize - размер передаваемого массива
//newMas - массив, подлежащий сортировке
Set_Mas(newSize, newArray);
};
//Формирование массива, элементы которого подлежат
//сортировке.
template <class T>
void CSort<T>::Set_Mas(int newSize, const T *newMas)
{
//newSize - размер передаваемого массива
//newMas - массив, подлежащий сортировке
//Проверяем на существование массива и в случае
//необходимости освобождаем память
if (Test_Mas())
delete[] array;
//Если размер передаваемого массива newSize корректен,
//запоминаем его элементы в массиве array
if (newSize > 0)
{
size = newSize; //запоминаем размер массива
array = new T[size]; //выделяем память под
//отсортированный массив
//запоминаем переданный массив
for (int i =0; i<size; i++)
array[i] = newMas[i];
}
else
{
//считаем, что нам ничего не передавали
size = 0;
array = NULL;
}
}
//Отображаем отсортированный массив
template <class T>
void CSort<T>::View_Mas()
{
View_Mas(size, array);
}
//Отображаем произвольный массив
template <class T>
void CSort<T>::View_Mas(int num, const T *mas)
{
//num - размер передаваемого массива
//mas - массив, подлежащий сортировке
//Отображаем массив mas из num элементов на экране
for (int i=0; i<num; i++)
cout<<mas[i];
cout<<endl;
}
//Сортировка массива array по возрастанию значений его элементов
template <class T>
void CSort<T>::Sort_Mas()
{
T tmp;
for (int i=0; i<size-1; i++)
for (int j=size-1; i<j; j--)
if (array[j-1]>array[j])
{
tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
}
}
//Проверка на существование массива array
template <class T>
bool CSort<T>::Test_Mas()
{
if (array)
return true;
else
return false;
}
//Возвращаем отсортированный массив
template <class T>
T *CSort<T>::Get_Mas() const
{
return array;
}
//Деструктор класса CIntSort
template <class T>
CSort<T>::~CSort()
{
//освобождаем память, выделенную под массив
if (Test_Mas())
delete[] array;
}
#endif
Файл «main.cpp».
/*
Программа сортировки массивов по возрастанию с
использованием шаблона классов
*/
//Включаем стандартные заголовочные файлы
#include <conio.h>
#include <iostream.h>
//Включаем заголовочный файл с описанием шаблона класса
//для сортировки массива
#include "SortClass.h"
//Объявляем шаблоны пользовательских функций
template <class T>
int Set_Mas(T**);
//Главная функция приложения
//Предполагаем, что сортировать будем массив,
//состоящий из элементов типа char
int main(int argc, char *argv[])
{
int i_mas_num; //Число элементов в массиве
char *i_mas; //Указатель на область памяти,
//которая будет динамически
//распределена под массив
//Создаем представитель класса, специализируя
//шаблон класса CSort для типа char
CSort<char> cIS;
//Формируем массив, специализируя функцию
//Set_Mas для типа char
i_mas_num = Set_Mas<char>(&i_mas);
//Формируем массив для сортировки
cIS.Set_Mas(i_mas_num, i_mas);
//Отображаем исходный массив на экране
cIS.View_Mas(i_mas_num, i_mas);
//Сортируем элементы массива по возрастанию
cIS.Sort_Mas();
//Отображаем отсортированный массив на экране
cIS.View_Mas();
}
/*
Шаблон функции, отвечающей за формирование массива эле-ментов, подлежащих
сортировке.
В качестве параметра передается указатель на указатель на область памяти,
предназначенной для хранения элементов типа T: **mas.
В случае удачного выполнения возвращается число элемен-тов в созданном массиве.
В противном случае возвращается 0 и выдается предупреждающее сообщение.
*/
template <class T>
int Set_Mas(T **mas)
{
int num; //Переменная для хранения
//числа элементов в массиве
//Запрос числа элементов будущего массива
cin>>num;
//Проверка размерности будущего массива
if (num <= 0)
{
/*
Если введен запрос на формирование массива, состоящего менее чем из 1 элемента,
то выводим сообщение об ошибке и возвращаем код некорректного выполнения нашей
функции.
*/
cout<<"Error size!!!";
cout<<endl;
return 0;
}
//Выделяем, динамическим образом, память под num
//элементов массива mas типа T
*mas = new T[num];
//Вводим элементы массива mas с консоли
for (int i=0; i<num; i++)
cin>>(*mas)[i];
cout<<endl;
//Возвращаем число элементов сформированного массива
return num;
}
Опубликовал Kest
September 12 2010 16:13:19 ·
0 Комментариев ·
11688 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.