Бесплатно зарегистрируйся и получай уведомления о новых проектах по работе

Заказ закрыт
Аналог шаблонов

t
Заказчик
Отзывы фрилансеров: + 0 - 0
Зарегистрирован на сайте 1 год и 5 месяцев
Бюджет: ожидает предложений
Срок: по договоренности
artPointers 

В этой задаче вам предстоит реализовать аналоги шаблонов std::shared_ptr и std::weak_ptr. 

## SharedPtr

Необходимо реализовать класс ```SharedPtr<T>```, который должен содержать следующие методы: 

(За описанием работы методов можно обращаться к cppref)

- Конструкторы
  – SharedPtr() – по умолчанию 
  – SharedPtr(Y* ptr) – конструктор от c-style указателя. Может быть как указатель на T, так и указатель на наследника T
  – SharedPtr(const SharedPtr<Y>&) – конструктор копирования 
  – SharedPtr(SharedPtr<Y>&&) – move-конструктор 
  – SharedPtr(Y* ptr, Deleter), где Y – либо T либо наследник T. Deleter – класс в котором есть ```operator()(Y*)```. Этот оператор нужно вызывать вместо уничтожения объекта под шаредом (освобождение памяти делать не нужно).
  – SharedPtr(Y* ptr, Deleter, Alloc), где Alloc – пользовательский аллокатор. Этот аллокатор используется для создания сущностей в динамической памяти, которые нужны для работы шареда. Аллокатор не должен применяться к уничтожению и освобождению ресурса (за это отвечает Deleter).
- operator=(const SharedPtr<Y>&) – оператор присваивания копированием
- operator=(SharedPtr<Y>&&) – оператор присваивания перемещением
- Деструктор – если при смерти шаред обнаруживает, что пора уничтожать объект, но объект на самом деле типа Y, где Y наследник T, то объект должен быть уничтожен как Y. При этом если был передан кастомный Deleter то объект должен быть уничтожен с помощью него.
- use_count – возвращает количество шаредов владеющих объектом.
- Метод get для получения c-style указателя
- операторы * и ->
- Метод reset() 

***Note*** Шаред на родителя можно инициализировать шаредом на наследника. Это относится и к конструкторам и к операторам присваивания.
***Note*** Alloc и Deleter это НЕ шаблонные параметры шареда. Унесите их в ControlBlock

Вне класса необходимо реализовать следующие функции:

- MakeShared – создает SharedPtr из аргументов. Эта функция должна обращаться к new ровно 1 раз. Не забудьте про форвардинг аргументов
- AllocateShared – делает то же что и MakeShared но с кастомным аллокатором. Этот же аллокатор должен быть использован для уничтожения и освобождения памяти под объект и под сущности шареда.

## WeakPtr

Необходимо реализовать класс ```WeakPtr<T>```, который должен содержать следующие методы:

- Конструкторы
  – WeakPtr()
  – WeakPtr(const WeakPtr<Y>&)
  – WeakPtr(const SharedPtr<Y>&)
  – WeakPtr(WeakPtr<Y>&&)
- operator=(const WeakPtr<Y>&) – оператор присваивания копированием
- operator=(WeakPtr<Y>&&) – оператор присваивания перемещением
- Деструктор
- expired – возвращает True если объект под виком все еще валиден (на него есть шаред)
- lock – возвращает SharedPtr на объект (если объект еще жив, иначе UB).
Разделы:
Опубликован:
20.09.2023 | 13:11 [поднят: 20.09.2023 | 13:11]
Заказ находится в архиве

Теги: нужен программист, резюме программиста, требуется программист, резюме веб программиста

Сведения об ООО «Ваан» внесены в реестр аккредитованных организаций, осуществляющих деятельность в области информационных технологий. ООО «Ваан» осуществляет деятельность, связанную с использованием информационных технологий, по разработке компьютерного программного обеспечения, предоставлению доступа к программе для ЭВМ и является правообладателем программы для ЭВМ «Платформа FL.ru (версия 2.0)».