我有一个多态对象,需要将它存储在多个位置,作为类型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。