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