Analoga szablonów
W tym zadaniu musisz zrealizować analogi szablonów std::shared_ptr i std::weak_ptr.#SharedPtr
Należy zrealizować klasę „SharedPtr”, która powinna zawierać następujące metody:
(Przekierowano do cppref, aby zapoznać się z metodami)
- projektantów
- SharedPtr() - wstępnie
- SharedPtr(Y* ptr) - konstruktor z c-style wskaźnika.Może to być zarówno wskaźnik T, jak i wskaźnik spadkobiercy T.
- SharedPtr(const SharedPtr&) - projektant kopiowania
- SharedPtr(SharedPtr&&) - projektant
- SharedPtr(Y* ptr, Deleter), gdzie Y - lub T lub spadkobierca T. Deleter - klasa, w której jest "operator(((Y*)".Operator ten musi zostać wywołany zamiast zniszczyć obiekt pod kulą (wypuszczanie pamięci nie jest konieczne).- SharedPtr(Y* ptr, Deleter, Alloc), gdzie Alloc jest alokatorem użytkownika.Alokator ten jest używany do tworzenia istot w pamięci dynamicznej, które są niezbędne do pracy pola.Alokator nie powinien być stosowany do niszczenia i uwalniania zasobów (dla tego odpowiedzialny jest Deleter).- operator=(const SharedPtr&) - operator przypisywania kopii
- operator=(SharedPtr&&) - operator przepływu
- Zniszczyciel - jeśli po śmierci strzał odkrywa, że czas zniszczyć obiekt, ale obiekt jest w rzeczywistości typu Y, gdzie Y jest spadkobiercą T, to obiekt musi być zniszczony jako Y. W tym samym czasie, jeśli został przekazany kastowy Deleter to obiekt musi być zniszczony za pomocą niego.- use_count - zwraca liczbę piłek posiadanych przez obiekt.- Metoda get do uzyskania wskaźnika c-style
- operatorów * i ->
- Metoda reset()
***Note*** Łódź na rodzica można inicjalizować łódź na spadkobiercę.Dotyczy to zarówno projektantów, jak i operatorów przydzielania.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *Wprowadź je do ControlBlock.
Poza klasą należy wykonać następujące funkcje:
- MakeShared - tworzy SharedPtr z argumentów.Ta funkcja powinna być skierowana do new dokładnie 1 raz.Nie zapominajmy o argumentach
- AllocateShared - robi to samo, co MakeShared, ale z alokatorem kastowym.Ten sam alokator powinien być używany do niszczenia i uwalniania pamięci pod obiektem i pod istotą piłki.• WeakPtr
Należy zrealizować klasę „WeakPtr”, która powinna zawierać następujące metody:
- projektantów
- WeakPtr()
- WeakPtr (const WeakPtr&)
- WeakPtr(const SharedPtr&)
- WeakPtr(WeakPtr&&)
- operator=(const WeakPtr&) - operator przypisywania kopiowaniem
- operator=(WeakPtr&&) - operator przypisywania ruchem
- destruktor
- expired - zwraca True, jeśli przedmiot pod krzykiem jest nadal ważny (na nim znajduje się strzałka)
- lock - zwraca SharedPtr na obiekt (jeśli obiekt jest jeszcze żywy, w przeciwnym razie UB).
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).