次のケースを検討してください。
typedef boost::shared_ptr<B> BPtr;
class A
{
public:
A() { b_ptr = BPtr(new B); }
void a_func() { C::c_func(b_ptr); }
private:
BPtr b_ptr;
}
class B
{
public:
B() { b_ptr = BPtr(this); }
void b_func() { C::c_func(b_ptr); }
private:
BPtr b_ptr;
}
class C
{
public:
static void c_func(BPtr b_ptr) { /*...*/ }
}
で shared_ptr をインスタンス化してもthis
よろしいですか?
2 つの shared_ptr オブジェクトが同じオブジェクトを指していても問題ありませんか? (例: A::b_ptr と B::b_ptr)
これら 2 つのうちの 1 つが範囲外になった場合、B のインスタンスは削除されますか?
私は何か根本的に間違ったことをしていると思います。
B のコンストラクターに b_ptr の依存性注入を使用することも考えましたが、それも非常に間違っているようです。
更新:
明確にするために - A と B の両方が C::c_func を使用する必要があります。次に、いくつかの処理の後、C は、上記で指定していない B のコールバック関数を呼び出す必要があります。実際、興味深いのは次の 2 つのケースです。
- C がステートフルではないという要件がある場合、上記のコードのように、A と B の両方から BPtr を受け取る必要があります。
- C がステートフルで、A と B の両方が個別の C インスタンスをインスタンス化し、C の ctor に BPtr を与える場合。