正确地为多态对象实现shared_ptr包装器

时间:2018-11-29 16:03:15

标签: c++ memory-management polymorphism shared-ptr

我有一个多态对象,需要将它存储在多个位置,作为类型Base的指针,该类型指向Derived类型的对象。我还需要能够将指针设置为其他派生类型的新对象,并在每个指针中显示更改(这涉及在国际象棋游戏中将棋子提升为另一种棋子类型)典当将被其他对象替换)。

我意识到使用std :: shared_ptr是不可能的,所以我创建了此类:

template <typename T> class superptr
{
private:
    std::shared_ptr<std::shared_ptr<T>> data;
public:
    superptr<T>(std::shared_ptr<T> ptr)
    {
        data = std::make_shared<std::shared_ptr<T>>(ptr);
    }
    superptr<T>(std::nullptr_t null)
    {
        data = null;
    }
    superptr<T>()
    {
        data = nullptr;
    }   
    T& operator*()
    {
        return **data;
    }
    std::shared_ptr<T>& operator->()
    {
        return *data;
    }
    void reset(T& t)
    {
        *data.reset(t);
    }
    std::shared_ptr<std::shared_ptr<T>> get() const
    {
        return data;
    }
    bool operator==(const superptr<T>& t)
    {
        return *data == *t;
    }
    bool operator!=(const superptr<T>& t)
    {
        return !(operator==(t));
    }
    bool operator==(std::nullptr_t t)
    {
        return (data == t);
    }
    bool operator!=(std::nullptr_t t)
    {
        return !(data == t);
    }
    superptr<T>& operator=(std::nullptr_t t)
    {
        data = nullptr;
        return *this;
    }
    superptr<T>& operator=(const superptr<T>& t)
    {
        data = t.get();
        return *this;
    }
    superptr<T>& operator=(const std::shared_ptr<T>& t) = delete;
};

我的想法是,当我更改基础指针时,该更改应显示在指向该指针的所有上级指针中,但事实并非如此。相反,只有一个实例被更改。我在哪里弄错了?

我正在使用Visual Studio和c ++ 17。

0 个答案:

没有答案