Реализуйте аналог std::shared_ptr
+ std::make_shared
. shared_from_this
реализовывать не нужно. Не забудьте про
поддержку
типов-массивов. Кастомный deleter - по желанию.
P.S. Желание делать deleter не возникло
Находится в файле include/shared_ptr.h
В качестве аналога std::shared_ptr
я разработал класс smart_pointer::shared_ptr
, который по большей части реализует
почти все методы std::shared_ptr
, а именно:
- Конструкторы для создания пустого указателя
- Конструктор от адреса, который приводится к типу указателя
- Конструкторы копирования и копирования с перемещением
- Оператор присваивания и оператор присваивания с перемещением
- Оператор разыменования
- Оператор -> (для скалярных типов)
- Оператор [] (для массивов)
- Метод
get()
- Методы
reset()
иreset(T*)
- Метод
use_count()
- Приватный метод
release()
, используемый в деструкторе, некоторых операторах иreset
Также была разработана функция smart_pointer::make_shared
, которая позволяет более удобно создавать
экземпляры shared_ptr
. По части ее перегрузок, реализованы все стандартные, кроме тех, что с deleter'ами.
smart_pointer::shared_ptr
и smart_pointer::make_shared
поддерживают типы-массивы практически идентично стандарту.
В реализации я старался по максимуму использовать новые возможности C++17 и C++20, такие как std::is_array
и requires
для упрощения написания кода.
Папка tests
Юнит-тесты написаны с помощью библиотеки GTest, интеграционные тесты используют в качестве таргета программу-обертку и запускаются в консоли с помощью bash.
Для сборки проекта рекомендуется использовать CMake актуальной версии и необходим компилятор, поддерживающий C++20. Для тестирования необходимо установить библиотеку GTest и valgrind (для интеграционных тестов).
В корне проекта находится файл CMakeLists.txt
, который содержит все необходимые инструкции для сборки проекта.
Для сборки проекта необходимо выполнить следующие команды:
mkdir build
cd build
cmake ..
make
В результате будут созданы исполняемые файлы в подпапках exe
и tests
.
Программа-обертка после сборки находится в папке build/exe
. Для запуска необходимо выполнить команду:
./build/exe/wrapper
Программа интерактивная, детальные инструкции по ее использованию приведены в комментариях в коде.
Она представляет собой иллюстрацию принципа полиморфизма в C++.
Юнит-тесты находятся в папке build/tests
. Для запуска необходимо выполнить команду:
./build/tests/tests
Интеграционные тесты находятся в папке tests/integr
. Для запуска необходимо выполнить команду:
bash tests/integr/tests.sh