2013-10-02 11 views
8

生のポインタメンバーをスマートポインタにラップして、開発中のクラスを削除しないようにしたいと思います。ポインタの下にあるオブジェクトの所有者はクラス外です。だから、boost::shared_ptrstd::auto_ptrのように見えません。以下は縮小例です。生ポインタからweak_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を初期化する正しい方法は何ですか?

+0

可能複製を行うことができますですコンバージョン](http://stackoverflow.com/questions/17522020/shared-ptr-weak-ptr-conversions) –

+1

あなたのクラス内でそのポインタを削除しないようにするには、 'delete'を呼び出さないでください。クライアントへのポインタを公開するアクセサ関数を提供しないでください。 'weak_ptr'は、' shared_ptr'が所有するオブジェクトを所有していないビューのためのものです。あなたが何とかそのポインタを 'weak_ptr'に入れることができたなら、ポインタが期限切れになったかどうか分からなくても、クラス内で' delete m_bar.lock()。get(); 'を呼び出すこともできません。すべてのことを100%馬鹿にすることは決してできません。 – Praetorian

答えて

10

あなたはそれを行うことはできません。あなたはshared_ptrや他のweak_ptrからweak_ptrを作成することしかできません。 したがって、ポインタの所有者が生ポインタの代わりにshared_ptrを保持し、すべてがokであるべきであるという考えがあります。

1

生ポインタの代わりに共有ポインタを渡し、その共有ポインタから弱ポインタ​​を作成します。ポインタの所有者がクラスの外にある場合、これは本当に唯一の方法です。

4

弱ポインタ​​の目的は、未処理のポインタが削除された場合にそのポインタを使用できないようにすることです。ただし、未処理のポインタがある場合、弱いポインタは削除されたことを知る方法がありません。その代わりに、rawポインタを「所有している」どこかにshared_ptrがなければなりません。次に、shared_ptrを参照するweak_ptrを作成することができます。

shared_ptrがスコープから外れて最後の "強力な"スマートポインタになると、自動的に生ポインタが削除されます。次に、weak_ptrをロックしようとすると、 "強い"ポインタが残っていないことがわかります。そのため、オブジェクトは存在しません。あなたが言った

2

すべてが一つのことを除いて、完全に合理的と思われる:

void setBar(const Bar *bar) 

これは、生のポインタを取るべきではありません。理想的にはweak_ptr、または説得力のある引数がある場合はshared_ptrが必要です。

問題のオブジェクトの実際の所有者は、weak_ptrを構築し、それにsetBarを呼び出す必要があります。これにより所有権の意味が保持されます。あなたがやっているのは、所有しているオブジェクトに生ポインタを持ち、それをsetBarに渡すことです。これは、オブジェクトの所有権に意味的なギャップを作ります。

5

これを実行する唯一の方法は、ポインタを所有するshared_ptrまたはweak_ptrを保持することです。そうでなければ、weak_ptrは所有権を共有するために既存の所有者を見つける方法がありません。

すでに別shared_ptrが所有している生のポインタからshared_ptrを取得する唯一の方法は、Barenable_shared_from_this<Bar>から派生した場合、その後、あなたは[\ _ptr&弱い\共有_ptrの

m_bar = bar->shared_from_this(); 
関連する問題