C++ для новичков: Шаблоны классов и массивов

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

Класс для работы с массивами

Рассмотрим простой класс для работы с массивами без использования шаблонов. Класс содержит поля 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 могут быть разных типов.

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

Что будем искать? Например,программа