В предыдущем уроке изучались шаблонные функции. Шаблоны классов работают аналогично, но применяются ко всему классу.
Класс для работы с массивами
Рассмотрим простой класс для работы с массивами без использования шаблонов. Класс содержит поля length (длина массива) и arr (указатель на массив).
class Array {
private:
int length;
int* arr;
public:
Array(int* a, int len) {
length = len;
arr = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = a[i];
}
}
~Array() {
delete[] arr;
}
void Get() {
for (int i = 0; i < length; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
};
Класс имеет конструктор (принимает массив и его длину, выделяет память и копирует данные), деструктор (освобождает память) и метод Get (выводит элементы массива).
Пример использования
Пример создания массива arr1 и объекта object1 класса Array:
int arr1[] = {1, 2, 3};
Array object1(arr1, 3);
object1.Get(); // Выведет: 1 2 3
Проблема с типами данных
При попытке создать объект класса Array с массивом типа float возникает ошибка компиляции, так как конструктор принимает только int.
Шаблонный класс
Для решения этой проблемы, используем шаблонный класс:
template <class T>
class Array {
private:
int length;
T* arr;
public:
Array(T* a, int len) {
length = len;
arr = new T[len];
for (int i = 0; i < len; i++) {
arr[i] = a[i];
}
}
~Array() {
delete[] arr;
}
void Get() {
for (int i = 0; i < length; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
};
template <class T> указывает, что T — параметр типа. Теперь можно создавать объекты с массивами разных типов:
float arr2[] = {1.1, 2.2, 3.3};
Array<float> object2(arr2, 3);
object2.Get(); // Выведет: 1.1 2.2 3.3
Несколько параметров типов
Можно использовать несколько параметров типов:
template <class T1, class T2>
class Array {
// ...
};
T1 и T2 могут быть разных типов.
Шаблонные классы позволяют создавать гибкие и многоразовые классы, работающие с различными типами данных. Они похожи на шаблонные функции и упрощают написание кода, избегая дублирования.