その有効性を確認する:参照オブジェクトに指摘し、次を考える
class Curve {
public:
typedef boost::shared_ptr<Curve> Pointer;
// ...
private:
// ...
};
class CurveShift: public Curve {
public:
CurveShift(const Curve & curve);
// ...
private:
const Curve & curve_;
// ...
};
私はあなたのような何かをしたいときに使用するコンセンサスのベストプラクティスがあるかどうかを疑問に思った:
Curve::Pointer pointer(new Curve());
SomeGlobalRepository::Add("key", pointer);
そして、あなたが持っているいくつかの他の場所で:
CurveShift cs(*SomeGlobalRepository::Get("key"));
あなたは本当に任意の保証のトンを持っていませんhat SomeGlobalRepository
には、CurveShift
が必要な場合は元のCurve::Pointer
が含まれているため、curve_
は、割り当て解除されたメモリ、または既に別のものに再割り当てされたメモリを指している可能性があります。私は可能な解決策はCurveShift
がconst Curve &
の代わりにboost:weak_ptr<Curve>
を使用することであると確信していますが、私はもうCurve
をスタック上で使用することができず、どのインスタンスもヒープコンストラクタはプライベートになり、オブジェクトは工場を通じて作成されます)。望ましい行動を達成するためのより良い戦略はありますか?理論的にはこれは深刻な問題になるかもしれないが、実用的なユースケースはこれらの難しい状況を生み出すことには役に立たないだろうと私は感心している。
なぜ 'CurveShift'は' shared_ptr '自体を保持していませんか?それは、「共有」がすべてのものであることのようなものです... –
Nemo
カーブのネットワークにサイクルが含まれているかどうかそうでなければ、すべては 'shared_ptr'でなければなりません。 'CurveShift'は参照を保持しているので、' CurveShift'はそれ以前に作成された 'Curve'を参照することしかできないので、私はどのようにサイクルが賢明になるのか分かりません。 'CurveShift'はサイクルを作成するために参照することができますが、それは非常に賢明ではないようです... –
シフトされるカーブがスタックに割り当てられている場合、shared_ptrをどのように取得しますか? – Hazerider