Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

  • GenericContainer.h: здесь Define шаблон вашего класса. Ваш GenericContainer должен:

    Динамически хранить элементы, используя указатель на массив, а также отслеживать current размер и capacity.

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

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

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

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

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

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

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

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

Например, для входных значений 10, 20, 30, 3.14 и true:

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

В этой задаче объединяются шаблоны класса для контейнера, специализация шаблона для пользовательского вывода bool и вариативные шаблоны для гибкой function 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: Print the size: "Int container size: <size>"
    
    // TODO: Call printContainer to display the integers
    
    // TODO: Создать GenericContainer<double> с ёмкостью 5
    
    // TODO: Добавить значение double и 2.5 с помощью отдельных вызовов push
    
    // TODO: Call printContainer to display the doubles
    
    // TODO: Создать GenericContainer<bool> с ёмкостью 5
    
    // TODO: Добавить булевый ввод и false
    
    // TODO: Call printContainer to display the booleans
    
    return 0;
}

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

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