Правильная реализация оболочки shared_ptr для полиморфного объекта - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть полиморфный объект, который мне нужно хранить в нескольких местах, как указатель типа 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;
};

Моя идея состоит в том, что когда я изменяю базовый указатель, это изменение должно отображатьсяво всех superptrs к этому указателю, но это не так.Вместо этого изменяется только один экземпляр.Где я ошибся?

Я использую Visual Studio и C ++ 17.

...