12

開発中のクラス内での削除を防ぐために、生のポインター メンバーをスマート ポインターにラップしたいと思います。ポインターの下のオブジェクトの所有者はクラス外です。だから、似boost::shared_ptrstd::auto_ptrいて合わない。以下は縮小された例です。

class Foo {
  boost::weak_ptr<Bar> m_bar;
public:
  void setBar(const Bar *bar) { // bar created on heap
    m_bar = bar;                // naturally compilation error
  }
};

もちろん、コンパイルエラーを誘発します。weak_ptr生のポインターから初期化する正しい方法は何ですか(存在する場合)?

4

5 に答える 5

10

これを行う唯一の方法は、ポインターを所有するshared_ptrorを取得することです。そうしないと、所有権を共有するために既存の所有者を見つける方法がありません。weak_ptrweak_ptr

shared_ptrすでに別のものによって所有されている生のポインターからを取得する唯一の方法shared_ptrは、 ifBarが から派生している場合enable_shared_from_this<Bar>、次のことができます。

m_bar = bar->shared_from_this();
于 2013-10-02T15:25:56.440 に答える
2

あなたが言ったことはすべて完全に理にかなっているように思えますが、1 つだけ:

void setBar(const Bar *bar)

これは生のポインタをとるべきではありません。説得力のある議論がある場合は、weak_ptr理想的に、またはおそらく aを取る必要があります。shared_ptr

weak_ptr問題のオブジェクトの実際の所有者は、それを呼び出すよりも andを構築する必要がありsetBarます。これにより、所有権のセマンティクスが保持されます。あなたがしていることは、所有しているオブジェクトに生のポインタを取り、それをsetBar. これにより、オブジェクトの所有権にセマンティック ギャップが生じます。

于 2013-10-02T15:11:09.390 に答える