基本エンティティ クラスと、牛や鶏などの派生クラスがあります...
using namespace std;
class Entity
{
list<shared_ptr<Relationship>> relationships;
void createRelationship(weak_ptr<Entity> other,.... other stuff)
//...
virtual ~Entity()
}
class Cow: public Entity
{
//...
}
class Chicken : public Entity
....etc...
std スマート ポインターを使用してメモリを適切に管理する方法を学習しようとしています。私が今やっている方法では、派生クラスが存在する唯一の場所は、次のような共有ポインターのベクトルです...
vector<shared_ptr<Cow>>
vector<shared_ptr<Chicken>>
etc.
私の Entity クラスは、同じタイプであるかどうかにかかわらず、2 つのエンティティ間の関係の管理を担当します。これを行うために、次のような Relationship オブジェクトのリストを保持しています...
class Relationship
{
weak_ptr<Entity> from;
weak_ptr<Entity> to;
etc....
}
牛や鶏が死ぬ可能性があるため、弱いポインターを使用します。その場合、他のエンティティとの関係が無効になるはずです。
だからここに私の問題があります。すべてを派生クラスへの共有ポインターとして保存しますが、Entity クラス内のすべてのコードは、基本クラスへの弱いポインターを使用します。弱いエンティティ ポインタを共有 Cow ポインタに変換したり、共有 Cow ポインタを弱いエンティティ ポインタに変換したりする必要がある場合がいくらかあります。
どういうわけか、私のコードでは、上記の Entity クラスの createRelationship(...) のパラメーターで shared_ptr オブジェクトを渡すことができます。なぜそれがコンパイルされるのかよくわかりません。それが効率的かどうか知りたいです。代わりに、手動で弱いポインターに変えてから、static_pointer_cast を使用してキャストする必要がありますか? (共有ポインタをパラメータとして渡すのが遅いことを読んだので、これを尋ねます。それが起こっているのではないかと心配しています)。
逆に、同じタイプの 2 つのエンティティ間に特定の関係があることを知っていることがあります。私の要点を説明すると、親から遺伝学を継承する必要がある子牛です。子牛はその関係を検索して親子関係を見つけ、親への弱いエンティティ ポインターにアクセスします。それらの遺伝メンバー変数にアクセスするには、エンティティへのこれらの弱いポインターを、Cow への共有ポインターにキャストする必要があります。これを達成するために、weak_ptr.lock() に続いて dynamic_pointer_cast を使用しています。
これは、これら 2 つの (反比例する) キャストを実行する効率的な方法ですか? 私はこれらのポインターを効率的に使用する方法を把握しようとしているので、一般的な意見や参考資料をいただければ幸いです。