我有一个抽象类Reticule
定义如下:
class Reticule : public Drawable, public Object {
//some irrelevant methods to the question
};
它用于绘制目标网格,即如果我想要一个咒语有一个圆圈或一个conal AoE reticule,我会从上面的类派生,例如:
class Circle : public Reticule {
public:
Circle(float radius);
//etc
};
我有另一个类World
,有两个方法,一个用于注册可绘制的东西,另一个用于注册对象。
class World {
public:
void registerDrawable(Drawable* drawable);
void registerObject(Object* object);
//other irrelevant methods
private:
std::list<Drawable*> drawables_;
std::list<Object*> objects_;
};
这些函数添加指向关联容器的指针。这允许世界上的对象彼此交互。
在我的咒语中,我正在创建这样的符号:
reticule_ = std::unique_ptr<Recitule>(new Circle(3.0f));
我的问题是,我打算如何将标线注册到我的World
课程。它的工作原理是:
world.registerDrawable(&(*reticule_));
world.registerObject(&(*reticule_)));
但这对我来说似乎不对,因为我将reticule_
定义为一个唯一的指针,我现在还有两个指向它的指针,它们不是Reticule*
类型的
我不应该使用unique_ptr
吗?我是否将所有内容更改为shared_ptr
,但在向世界添加简单对象时没有意义。
答案 0 :(得分:3)
如果您希望它们“拥有”它,则无法使用unique_ptr
。在这种情况下,shared_ptr
是合适的。
或者你可以注册原始指针。但是,您需要确保在销毁对象之前取消注册该对象。这会产生其他问题,因为在析构函数中抛出是一件坏事。
在简单对象上使用shared_ptr
很好,除非探查器告诉您这是一个问题,否则我的建议。