1

Reticule次のように定義された抽象クラスがあります。

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

ターゲティング レチクルを描画するために使用されます。つまり、呪文に円または円錐形の AoE レチクルを持たせたい場合は、上記のクラスから派生させます。

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

    //etc
};

2 つのメソッドを持つ別のクラスWorldがあります。1 つは描画可能なものを登録するためのもので、もう 1 つはオブジェクトを登録するためのものです。

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 に答える