2012-05-10 19 views
7

Sto cercando di passare 'questo' al costruttore utilizzando std :: make_sharedC++ 11 Passaggio 'questo' come paramenter per std :: make_shared

Esempio:

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

Tuttavia questo non funziona correttamente, qualche suggerimento su come posso passarlo correttamente come argomento?

risposta

13

Penso che quello che probabilmente vuoi qui è 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()); 
} 

aggiornamento per includere comments from David Rodriguez:

Nota che shared_from_this() dovrebbe mai essere chiamato su un oggetto che non è già gestito da un shared_ptr. Questo è valido:

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

Mentre i seguenti porta a comportamento non definito (il tentativo di chiamare delete su a):

A a; 
a.createB(); 
+0

Grazie mille Andrew! – RdR

+7

È importante notare che 'shared_from_this()' richiede che l'oggetto corrente sia già gestito in un 'shared_ptr'. Cioè 'int main() {A a; a.createB(); } 'è un comportamento non definito, mentre' int main() {shared_ptr a (nuovo A); a-> createB(); } 'è corretto. –

+0

@ DavidRodríguez-dribeas Assolutamente. Ho aggiornato la risposta di conseguenza. Grazie. –

Problemi correlati