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