Итоги — Обобщенный контейнер
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 69 из 104.
Задание
ЛегкоДавайте создадим шаблон класса GenericContainer, который объединяет всё, что вы узнали о шаблонах в этой главе. Вы создадите гибкий, типобезопасный контейнер, способный динамически хранить элементы и предоставлять полезные операции с помощью шаблонных методов.
Вы организуете код в двух файлах:
GenericContainer.h: здесь Define шаблон вашего класса. ВашGenericContainerдолжен:Динамически хранить элементы, используя указатель на массив, а также отслеживать current размер и capacity.
Предоставлять следующие основные методы:
- Конструктор, принимающий initial capacity
- Деструктор, корректно освобождающий динамическую память
push(T value): добавляет элемент в контейнер (считайте, что capacity всегда достаточно для этой задачи)get(size_t index): возвращает элемент по указанному indexgetSize(): возвращает текущее количество элементов
Добавьте шаблон function с именем
printContainer, который принимаетGenericContainer<T>&и выводит все элементы, разделённые пробелами, с последующим переводом строки.Создайте специализацию шаблона для
printContainerдляGenericContainer<bool>, которая выводитtrueилиfalseвместо1или0.Добавьте вариативный шаблон function с именем
pushAll, который принимаетGenericContainer<T>&и любое количество значений, добавляя каждое из них в контейнер с использованием fold expression.main.cpp: считайте пять входных значений (каждое в отдельной строке):- Первое целое число
- Второе целое число
- Третье целое число
- Значение типа double
- boolean в виде строки (
trueилиfalse)
Продемонстрируйте работу контейнера следующим образом:
- Создайте
GenericContainer<int>с capacity 10 - Используйте
pushAll, чтобы добавить все три целых числа одновременно - Выведите размер:
Int container size: <size> - Вызовите
printContainer, чтобы отобразить целые числа - Создайте
GenericContainer<double>с capacity 5 - Добавьте значение типа double и literal
2.5с помощью отдельных вызововpush - Вызовите
printContainer, чтобы отобразить doubles - Создайте
GenericContainer<bool>с capacity 5 - Добавьте boolean input и literal
false - Вызовите
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;
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыСборка и компиляция C++Заголовочные файлы и файлы исходного кодаПространства имен и область видимостиВведение в ООП на C++Классы и объектыУказатель 'this'Методы (функции-члены)Атрибуты (члены данных)Основы конструкторов и деструкторовИтоги — Простой калькулятор4Свойства классов
Члены экземпляра против статическихГеттеры и сеттерыКонстантные функции-членыКлючевое слово mutableСтатические методы и переменныеДружественные функции и классыИтоги — Менеджер банковских счетов7Наследование
Основы наследованияУровни доступа при наследованииПорядок вызова конструкторов и деструкторовПереопределение методовВиртуальные функции и VTableМножественное наследованиеВиртуальное наследованиеИтоги — Иерархия сотрудников10Обзор STL
Обзор и философия STLКонтейнеры STLИтераторыАлгоритмы STLФункторы и лямбда-выраженияИтоги: частота слов13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonFactory и Abstract FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy2Управление памятью
Стек и кучаУказатели и ссылкиДинамическая память (new/delete)Умные указатели в C++RAII в C++Итоги — Менеджер динамического массива5Инкапсуляция
Спецификаторы доступа в C++Спецификаторы доступа: подробный разборСокрытие данныхStruct против ClassВложенные и внутренние классыИтоги — Система учета студентов8Полиморфизм
Полиморфизм компиляции и времени выполненияПерегрузка функцийВиртуальные функции: повторениеЧистые виртуальные функцииАбстрактные классыПроектирование интерфейсов на C++Dynamic Casting и RTTIИтоги: Калькулятор фигур11Продвинутые концепции ООП
Композиция против наследованияМиксины через CRTPИдиома PimplСтирание типовEnum Classes и строгая типизацияОбработка исключений в ООППользовательские иерархии исключений14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикRAII как паттерн3Конструкторы и деструкторы
Конструктор по умолчаниюПараметризованный конструкторКонструктор копированияКонструктор перемещенияСписки инициализации конструктораДелегирующие конструкторыГлубокое погружение в деструкторыПравило трех / пяти / нуляПовторение — класс String6Перегрузка операторов
Введение в перегрузку операторовПерегрузка арифметических операторовПерегрузка операторов сравненияОператоры потоковПерегрузка оператора присваиванияПерегрузка операторов [] и ()Операторы преобразования типовИтоги — класс Matrix9Шаблоны
Шаблоны функцийШаблоны классовСпециализация шаблоновВариативные шаблоныОсновы SFINAE и Type TraitsИтоги — Обобщенный контейнерПотренируйтесь самостоятельно: Онлайн-компилятор C++