Menu
CoddyTech

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

Часть раздела Объектно-ориентированное программирование путешествия по 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>& и любое количество значений, добавляя каждое из них в контейнер с помощью свёрточного выражения. Свёртка с оператором запятая, например (container.push(args), ...);, выполняет вызов один раз для каждого аргумента.

  • main.cpp: Считай пять входных значений (каждое в отдельной строке):
    1. Первое целое число
    2. Второе целое число
    3. Третье целое число
    4. Число с плавающей запятой двойной точности
    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, чтобы вывести числа типа double
    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 

В этой задаче объединяются шаблоны классов для контейнера, специализация шаблона для особого вывода логических значений и вариативные шаблоны для гибкой функции 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;
}

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

Потренируйтесь самостоятельно: Онлайн-компилятор C++