は、私はクラスがあるとします。C++で共有/弱ポインタを使用して互いに参照する2つのオブジェクトをきれいに実装する方法はありますか?
class Entity {
vector<weak_ptr<Entity> > aboveMe;
vector<weak_ptr<Entity> > belowMe;
void addBelow(weak_ptr<Entity> below)
{
belowMe.push_back(below);
}
void addAbove(weak_ptr<Entity> above)
{
aboveMe.push_back(below);
}
}
これは常に真でなければならない:
If an Entity A is above an Entity B, B is below A and vice versa.
これを表現するための最もエレガントな方法は何でしょうか?
a->addBelow(b).
を
しかし、不変に違反し
b->addAbove(a)
に対応するコールなし:
は現在、それは単に呼び出すために、クライアントコードが可能です! Javaでは
、一つはこのようなものだろう:
void addBelow(Entity below)
{
belowMe.add(below);
below.addAbove(this); // With obviously some mechanism to prevent infinite recursion
}
共有/弱いポインタを使用する際にC++でこれを行うための最善の方法は何を?
あなたの 'Entity'ストアはすべてより大きな構造になっていますか?もしそうなら、共有/弱ポインタの代わりに['reference_wrapper'](http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper)を格納することができます。それ以外の場合は、['enable_shared_from_this'](http://en.cppreference.com/w/cpp/memory/enable_shared_from_this)をご覧ください。 – Holt
はい、オブジェクトはshared_ptrのベクトルとして格納と割り当てを処理するより大きい「シーンモデル」オブジェクトに格納されます。それらのunique_ptrを作成し、それらのreference_wrappersを使用してオブジェクト間の参照を作成する必要がありますか? –
user1582024
これらのオブジェクトが他の場所の 'shared_ptr'に既に格納されている場合は、' enable_shared_from_this'を使うべきです(Smeeheeyの答えを参照)。 – Holt