Итоги — Менеджер динамического массива
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 17 из 104.
Задание
ЛегкоДавайте создадим класс DynamicArray, который самостоятельно управляет своей памятью и автоматически увеличивается при необходимости — именно так под капотом работает std::vector!
Вы создадите два файла, чтобы организовать свой код:
DynamicArray.h: Define классDynamicArray, который управляет массивом целых чисел динамического размера. Ваш класс должен иметь:- Приватные члены: указатель на массив data, current размер (количество элементов) и capacity (выделенное пространство)
- Конструктор, принимающий initial capacity, выделяющий массив в куче и инициализирующий size значением 0
- Деструктор, освобождающий выделенную память и выводящий
"DynamicArray destroyed" - Метод
push(int value), который добавляет элемент в array. Если array заполнен, он должен удвоить capacity, выделив новый массив большего размера, скопировав existing элементы и освободив старый array - Метод
get(size_t index), который возвращает element с указанным index - Метод
getSize(), который возвращает current количество элементов - Метод
getCapacity(), который возвращает current capacity
main.cpp: Считайте initial capacity и количество значений для добавления. Затем считайте такое количество целочисленных значений и добавьте каждое из них в ваш DynamicArray. После добавления всех значений выведите:"Size: <size>""Capacity: <capacity>""Elements: <e1> <e2> ..."(все элементы разделены пробелами)
Формат входных данных:
- Первая строка: initial capacity (целое число)
- Вторая строка: количество значений для добавления (целое число)
- Следующие строки: по одному целому значению в каждой строке
При изменении размера ваш array должен удваивать свою capacity. Например, если начать с capacity 2 и добавить третий элемент, capacity должна стать равной 4. Это демонстрирует принцип RAII. Ваш класс получает память в конструкторе и освобождает её в деструкторе, что гарантирует отсутствие утечек памяти.
Подключите header-файл в main.cpp с помощью #include "DynamicArray.h".
Попробуйте сами
#include <iostream>
#include "DynamicArray.h"
using namespace std;
int main() {
// Считать начальную ёмкость
int initialCapacity;
cin >> initialCapacity;
// Считать количество значений для добавления
int numValues;
cin >> numValues;
// TODO: Create a DynamicArray with the initial capacity
// TODO: Считать numValues целых чисел и добавить каждое в массив
// TODO: Вывести "Size: <size>"
// TODO: Вывести "Capacity: <capacity>"
// TODO: Вывести "Elements: <e1> <e2> ..." (все элементы, разделённые пробелами)
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++