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