Для образовательных целей, я был ранее сегодня реализует класс обертку, определенный ниже (это взято из книги):Простой класс-оболочка против смарт-указатель
#ifndef WRAPPER_H
#define WRAPPER_H
template<class T>
class Wrapper
{
public:
Wrapper()
{ dataPtr = 0; }
Wrapper(const T& inner)
{
dataPtr = inner.clone();
}
Wrapper(const Wrapper<T> &original)
{
if (original.dataPtr != 0)
dataPtr = original.dataPtr->clone();
else
dataPtr = 0;
}
Wrapper &operator =(const Wrapper<T> &original)
{
if (this != &original)
{
if (dataPtr != 0)
delete dataPtr;
dataPtr = (original.dataPtr !=0) ? original.dataPtr->clone() : 0;
}
return *this;
}
~Wrapper()
{
if (dataPtr != 0)
delete dataPtr;
}
T &operator*()
{
return *dataPtr;
}
const T&operator*() const
{
return *dataPtr;
}
T *operator->()
{
return dataPtr;
}
const T * const operator->() const
{
return dataPtr;
}
private:
T *dataPtr;
};
#endif
Основная идея заключается в том, чтобы действовать в качестве указателя , с дополнительным преимуществом по уходу за памятью, конструктором копирования, деструктором и оператором присваивания. Он обертывает классы, которые имеют метод клонирования: они возвращают указатель на копию самих себя (не для себя, для новой копии, сделанной с new
Class(*this)
).
В некотором роде это похоже на unique_ptr
, поскольку обернутый объект доступен только через эту оболочку. Однако есть разница, о чем мой вопрос. В этом классе-оболочке существует конструктор, определяемый путем принятия ссылки на объект класса, который он обертывает (первый конструктор в приведенном выше коде).
Это очень удобно. Предположим, что у нас есть классы A
и B
, а конструктор для B
ссылается на Wrapper<A>
. Тогда можно построить объект B
с другим объектом A
:
A object1;
B object2(A);
Это потому, что object2
используется для построения Wrapper<A>
(затем передается в конструктор B
) с использованием указанного выше Wrapper
конструктора.
Возможно ли это сделать с помощью любого из умных указателей в std::memory
? Моя главная цель здесь - образовательная, но на практике я не хочу изобретать велосипед.
Копировальный конструктор недоступен для уникальных указателей, поскольку после копии они больше не будут уникальными. Вместо общих указателей вместо _copyable_, где копия просто обеспечивает тот факт, что они _share_ являются собственностью заостренного объекта. – skypjack
Похоже, что он делает глубокие копии, а не передает/перемещает указатель. – user4581301
Похож на intrusive_ptr –