Итоги — Обобщенный контейнер
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 69 из 104.
Задание
ЛегкоДавай создадим шаблон класса 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: Считай пять входных значений (каждое в отдельной строке):- Первое целое число
- Второе целое число
- Третье целое число
- Число с плавающей запятой двойной точности
- Логическое значение в виде строки (
trueилиfalse)
Продемонстрируй работу контейнера:
- Создай
GenericContainer<int>с вместимостью 10 - Используй
pushAll, чтобы добавить все три целых числа одновременно - Выведи размер:
Int container size: <size> - Вызови
printContainer, чтобы вывести целые числа - Создай
GenericContainer<double>с вместимостью 5 - Добавь значение типа double и литерал
2.5отдельными вызовамиpush - Вызови
printContainer, чтобы вывести числа типа double - Создай
GenericContainer<bool>с вместимостью 5 - Добавь введённое логическое значение и литерал
false - Вызови
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;
}
Все уроки раздела Объектно-ориентированное программирование
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++