1

我有一个Reticule像这样定义的抽象类:

class Reticule : public Drawable, public Object {
    //some irrelevant methods to the question
};

它用于绘制目标标线,即如果我想要一个具有圆形或锥形 AoE 标线的法术,我将从上述类派生,例如:

class Circle : public Reticule {
public:
    Circle(float radius);

    //etc
};

我有另一个World具有 2 个方法的类,一个用于注册可绘制的东西,另一个用于注册对象。

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_为唯一指针,现在我还有 2 个指向它的指针,它们只是不是类型Reticule*

我不应该使用unique_ptr吗?我是否将所有内容都更改为,shared_ptr但是在向世界添加简单对象时这没有意义。

4

1 回答 1

3

unique_ptr如果您希望他们都“拥有”它,则不能使用。在那种情况下shared_ptr是合适的。

或者,您可以注册原始指针。但是,您需要确保在对象被销毁之前取消注册该对象。这会产生其他问题,因为在析构函数中抛出是一件坏事。

不过,在简单对象上使用shared_ptr很好,除非分析器告诉您这是一个问题,否则这是我的建议。

于 2012-08-17T20:40:38.033 回答