diff --git a/SharedPtr.hpp b/SharedPtr.hpp index 6f3de5b..0735f20 100644 --- a/SharedPtr.hpp +++ b/SharedPtr.hpp @@ -16,7 +16,7 @@ template struct Base { T *ptr; Base(T *ptr) : ptr{ptr} {} - template Base(Base const &ptr) : ptr{ptr.ptr} {} + template Base(Base &ptr) : ptr{ptr.ptr} {} public: virtual T &operator*() { return *ptr; } @@ -28,6 +28,7 @@ template class MyDerived : public Base { public: MyDerived(U *ptr) : Base{ptr} { this->ptr = ptr; } + MyDerived(Base &ptr) : Base{ptr.ptr} { this->ptr = ptr.ptr; } U &operator*() { return *ptr; } U *operator->() { return ptr; } virtual ~MyDerived() { delete this->ptr; } @@ -46,7 +47,9 @@ public: static_cast(ptr ? 1 : 0)}} {} SharedPtr(const SharedPtr &p) : ptr{p.ptr}, count{p.count} {} template - SharedPtr(const SharedPtr &p) : ptr(p.ptr), count{p.count} { + SharedPtr(const SharedPtr &p) + : ptr(MyDerived(const_cast &>(*p.ptr))), + count{p.count} { (*count)++; } SharedPtr(SharedPtr &&p) : ptr{p.ptr} { p.ptr = nullptr; }