Entity
オブジェクトの唯一の所有者はEntityManager
です。unique-owner-collectionからweak_ptrまたはshared_ptrを返す必要がありますか?
class EntityManager
{
public:
std::weak_ptr<Entity> vs std::shared_ptr<Entity> getEntityByID(int ID) const;
private:
std::vector<std::shared_ptr<Entity>> entities;
};
Entity
は、プログラムで使用する必要があり、それがgetEntityByID
機能を使用することによりEntityManager
から受信します。 EntityManager
は所有者のみであるため、
Entity
は、しかし、それはとweak_ptr
として多くの場所に保存されていることができ、shared_ptr
などのプログラムの他の場所に格納すべきではありません。
getEntityByID
は、戻り値としてweak_ptr
を使用するためのweak_ptr
またはshared_ptr
私の引数を返す必要があり、場合私の質問は次のとおりです。
- それはweak_ptrをエンティティを取得した後に使用する必要があることをgetEntityByID関数のシグネチャで明らかです。戻り値として
shared_ptr
を使用するための
マイ引数:
weak_ptr
はとにかくshared_ptr
に変換することができ、そして他の場所でshared_ptr
のように保存することができます。さらに、すべての使用で、lock
機能を使用してshared_ptrに変換されていました。shared_ptr
が使用されると、すべての機能では、それはちょうどshared_ptr
を渡すことができます。 ptrを使うたびにlock
関数を使う必要はもうありません。もしそれがポインタを格納するために を決定するなら、それは単にデータメンバとしてそれをweak_ptrにコピーするでしょう。
'EntityManager'が一意の所有者である場合、' std :: vector 'を返し、参照を返してみませんか? –
共有/弱ポインタを使用しているのはなぜですか?呼び出し元がリソースが削除された後にポインタを使用しようとする可能性はありますか? – Galik
または一意のポインタのベクトルと借用された生ポインタを返します。 – Flexo