2011-01-04 9 views
8

オブジェクトがまだ構築されていないので、クラスのコンストラクタからshared_from_this()を呼び出すことによってshared_ptrを取得することはできないことを理解します。しかし、コンストラクタからオブジェクトにweak_ptrを取得することは可能ですか? 「weak_from_raw()」メソッドについて議論しているいくつかのブーストフォーラム投稿では、可能性があることが示唆されています。これにコンストラクタ内の弱いポインタ

編集:http://lists.boost.org/boost-users/2010/08/61541.php

+0

あなたは 'weak_from_raw()'について議論しているフォーラムへのリンクを投稿できますか? –

+0

sooとは思わないでください。 "weak_ptrは、すでにshared_ptrによって管理されているオブジェクトに「弱い参照」を保存します。 – ronag

+0

@Sam http://groups.google.com/group/boost-list/browse_thread/thread/36d8e06194227408/5625f636b47fdb96?pli=1 – James

答えて

15

weak_from_raw議論ブーストフォームは私はあなたがis thisを参照しているものと思います。これは、ブーストリリースにマージされていないようだ(それについて間違っている可能性があります)。 boost docsから

よくある質問

Q.オブジェクトはコンストラクタで自身へのweak_ptrを作成することはできますか?

A.号Aのweak_ptrのみのshared_ptrから作成することができ、オブジェクトの構築時にオブジェクトへのshared_ptrのはまだ存在しません。これに対して一時的なshared_ptrを作成することができたとしても、コンストラクタの終わりにスコープから外れ、すべてのweak_ptrインスタンスが即座に期限切れになります。

解決策は、コンストラクタをプライベートにし、shared_ptrのを返すファクトリ関数を提供することです:

class X 
{ 
private: 

    X(); 

public: 

    static shared_ptr<X> create() 
    { 
     shared_ptr<X> px(new X); 
     // create weak pointers from px here 
     return px; 
    } 
}; 
+0

答えをいただきありがとうございました。不足している大括弧を追加するために[編集拒否](https://stackoverflow.com/review/suggested-edits/17164598)を手に入れました:-) – PhilLab

+0

括弧はありません;) 'new X'はXのインスタンスをデフォルトで初期化します。かっこを追加すると、代わりに直接初期化されます(http://en.cppreference.com/w/cpp/language/newを参照) – James

+0

うわー、私は毎日何か新しいことを学びます。ありがとう – PhilLab

5

参照:http://boost.org/doc/libs/1_42_0/libs/smart_ptr/sp_techniques.html#in_constructor

問題は、オブジェクトが構築されていないということではありません。問題は、shared_ptrが構築されていないことです。あなたがしなければならないのは、shared_ptrを作成して、どこかで送信して、すべてがうまくいくようにすることでした。これは、作成したばかりのオブジェクトを格納するshared_ptrを作成しようとするときです。 2つを接続する方法がないため、大きな問題があります。

shared_from_thisが動作する方法は、あなたがshared_ptrを呼び出してからアクセスする前にshared_ptrオブジェクトを置くことを期待しているということです。まだ完了していないので、オブジェクトのコンストラクタが終了せず、shared_ptrが接続されていないので、shared_from_thisを呼び出すことはできません。

weak_ptrとまったく同じ問題があります。

だから、他の言葉で、この不条理な構築物は動作します:

struct absurd 
{ 
    absurd() 
    { 
    register(shared_ptr<absurd>(this)); 
    } 
}; 

... 
new absurd; // better not assign to a shared_ptr!!! 

をしかし、あなたは本当にこれを行うにはしたくありません。

関連する問題