Menu
Coddy logo textTech

Итоги — Обобщенный контейнер

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy — урок 69 из 104.

challenge icon

Задание

Легко

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

Вы организуете свой код в двух файлах:

  • GenericContainer.h: Определите здесь свой шаблон класса. Ваш GenericContainer должен:

    Хранить элементы динамически, используя указатель на массив, а также отслеживать текущий размер и емкость.

    Предоставлять следующие основные методы:

    • Конструктор, принимающий начальную емкость
    • Деструктор, который правильно очищает динамическую память
    • push(T value) — добавляет элемент в контейнер (предположим, что емкости всегда достаточно для этого задания)
    • get(size_t index) — возвращает элемент по заданному индексу
    • getSize() — возвращает текущее количество элементов

    Добавьте шаблон функции под названием printContainer, который принимает GenericContainer<T>& и выводит все элементы, разделенные пробелами, за которыми следует символ новой строки.

    Создайте специализацию шаблона printContainer для GenericContainer<bool>, которая выводит true или false вместо 1 или 0.

    Добавьте вариативный шаблон функции под названием pushAll, который принимает GenericContainer<T>& и любое количество значений, добавляя каждое из них в контейнер с помощью выражения свертки (fold expression).

  • main.cpp: Считайте пять входных данных (каждое на отдельной строке):
    1. Первое целое число
    2. Второе целое число
    3. Третье целое число
    4. Значение типа double
    5. Логическое значение в виде строки ("true" или "false")

    Продемонстрируйте работу вашего контейнера следующим образом:

    1. Создайте GenericContainer<int> с емкостью 10
    2. Используйте pushAll, чтобы добавить все три целых числа одновременно
    3. Выведите размер: Int container size: <size>
    4. Вызовите printContainer для отображения целых чисел
    5. Создайте GenericContainer<double> с емкостью 5
    6. Добавьте значение double и литерал 2.5, используя отдельные вызовы push
    7. Вызовите printContainer для отображения чисел с плавающей точкой
    8. Создайте GenericContainer<bool> с емкостью 5
    9. Добавьте введенное логическое значение и литерал false
    10. Вызовите printContainer для отображения логических значений (должно отображаться true/false)

Например, при входных данных 10, 20, 30, 3.14 и "true":

Int container size: 3
10 20 30 
3.14 2.5 
true false 

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

Попробуйте сами

#include <iostream>
#include <string>
#include "GenericContainer.h"

using namespace std;

int main() {
    // Чтение входных данных
    int num1, num2, num3;
    double doubleVal;
    string boolStr;
    
    cin >> num1;
    cin >> num2;
    cin >> num3;
    cin >> doubleVal;
    cin >> boolStr;
    
    // Преобразование строки в bool
    bool boolVal = (boolStr == "true");
    
    // TODO: Создать GenericContainer<int> емкостью 10
    
    // TODO: Использовать pushAll, чтобы добавить все три целых числа сразу
    
    // TODO: Вывести размер: "Int container size: <size>"
    
    // TODO: Вызвать printContainer для отображения целых чисел
    
    // TODO: Создать GenericContainer<double> емкостью 5
    
    // TODO: Добавить значение double и 2.5, используя отдельные вызовы push
    
    // TODO: Вызвать printContainer для отображения чисел double
    
    // TODO: Создать GenericContainer<bool> емкостью 5
    
    // TODO: Добавить введенное логическое значение и false
    
    // TODO: Вызвать printContainer для отображения логических значений
    
    return 0;
}

Все уроки раздела Объектно-ориентированное программирование