2012-05-10 20 views
7

make_shared:C++ 11 Geçme 'bu' için parametresine olarak std :: Ben std :: make_shared</p> <p>Örnek kullanarak 'bu' yapıcı geçmek çalışıyorum

// 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; 
} 

Ancak bu düzgün çalışmıyor, herhangi bir öneriyi bunu bir argüman olarak nasıl doğru bir şekilde iletebilirim?

cevap

13

Sanırım burada isteyeceğiniz şey 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()); 
} 

Güncelleme comments from David Rodriguez içerecek şekilde: shared_from_this() gerektiği asla zaten shared_ptr tarafından yönetilmeyen bir nesne üzerinde çağrılmasını

Not. Bu geçerlidir:

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

istenmeyen davranışlara aşağıdaki derivasyon (a üzerine delete arama girişiminde) iken: Andrew sürü

A a; 
a.createB(); 
+0

teşekkürler! – RdR

+7

'shared_from_this() 'işlevinin, mevcut nesnenin zaten bir" shared_ptr "içinde yönetilmesini gerektirdiğini unutmamak önemlidir. Yani int main() {A a; a.createB(); } 'un tanımsız davranışı; int main() {shared_ptr a (yeni A); a-> createB(); } doğrudur. –

+0

@ DavidRodríguez-dribeas Kesinlikle. Cevabı buna göre güncelledim. Teşekkürler. –

İlgili konular