2012-05-10 4 views
7

make_shared:C++ 11を渡す 'この' のparamenterとしてのstd ::私がのstd :: make_shared</p> <p>例使用して 'この' コンストラクタに渡すためにしようとしている

// headers 
class A 
{ 
public: 
    std::shared_ptr<B> createB(); 
} 


class B 
{ 
private: 
    std::shared_ptr<A> a; 

public: 
    B(std::shared_ptr<A>); 
} 


// source 
std::shared_ptr<B> A::createB() 
{ 
    auto b = std::make_shared<B>(this); // Compiler error (VS11 Beta) 
    auto b = std::make_shared<B>(std::shared_ptr<A>(this)); // No compiler error, but doenst work 
    return b; 
} 

しかし、これを適切に動作しません、どのように私は適切にこれを引数として渡すことができますどのような提案?

答えて

13

おそらくここにほしいと思うのはshared_from_thisです。

// headers 
class A : std::enable_shared_from_this<A> 
{ 
public: 
    std::shared_ptr<B> createB(); 
} 


class B 
{ 
private: 
    std::shared_ptr<A> a; 

public: 
    B(std::shared_ptr<A>); 
} 


// source 
std::shared_ptr<B> A::createB() 
{ 
    return std::make_shared<B>(shared_from_this()); 
} 

更新comments from David Rodriguezを含めますshared_from_this()べき決してがすでにshared_ptrによって管理されていないオブジェクトで呼び出されることを

注意。これは有効です:アンドリューたくさん

A a; 
a.createB(); 
+0

ありがとう:未定義の動作(adeleteを呼び出そうと)を次のようにリードしながら

shared_ptr<A> a(new A); a->createB(); 

! – RdR

+7

'shared_from_this()'は、現在のオブジェクトがすでに 'shared_ptr'で管理されていることを要求することに注意することが重要です。私。 'int main(){A a; a.createB(); } 'は未定義の振る舞いですが、' int main(){shared_ptr a(new A); a-> createB(); } '正しいです。 –

+0

@DavidRodríguez-dribeas絶対に。私はそれに応じて答えを更新しました。ありがとう。 –

関連する問題