Блок задач

8. Чёрные ящики

Темы
Сложность 2

Задача «Умный указатель (unique)»

Задание

Самостоятельно реализовать "умный указатель", осуществляющий стратегию единоличного владения ресурсом, аналогичный std::unique_ptr

Описание

Интерфейс указателя должен:

  • Инкапсулировать переданный в него указатель.
  • При удалении "умного указателя", по умолчанию, он должен удалить переданный в него указатель.
  • Должны быть определены операторы разыменования (* и ->).
  • Должен быть следующие методы: очистка указателя, обмен с другим "умным указателем", инкапсуляция нового указателя.
  • Конструктор копирования и оператор присваивания должны быть запрещены.

Пример интерфейса

template<class Type, class TDeleter>
class UniquePTR {
    typedef UniquePTR<Type, TDeleter> t_UniquePTR;
public: // Constructors and destructor.
    UniquePTR();
    UniquePTR(Type *pObject);
    UniquePTR(t_UniquePTR &&uniquePTR); // Move constructor.
    ~UniquePTR();
public: // Assignment.
    UniquePTR& operator=(t_UniquePTR &&uniquePTR);
    UniquePTR& operator=(Type *pObject);
public: // Observers.
    Type& operator*() const; // Dereference the stored pointer.
    Type* operator->() const; // Return the stored pointer.
    Type* get() const; // Return the stored pointer.
    TDeleter& get_deleter(); // Return a reference to the stored deleter.
    operator bool() const; // Return false if the stored pointer is null.
public: // Modifiers.
    Type* release(); // Release ownership of any stored pointer.
    void reset(Type *pObject = nullptr); // Replace the stored pointer.
    void swap(t_UniquePTR &uniquePTR); // Exchange the pointer with another object.
private: // Disable copy from lvalue.
    UniquePTR(const t_UniquePTR&) = delete;
    t_UniquePTR& operator=(const t_UniquePTR&) = delete;
};