2012-05-10 15 views
7

Próbuję przekazać 'to' do konstruktora przy użyciu std :: make_sharedC++ 11 Passing 'to' jako paramenter dla std :: make_shared

Przykład:

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

Jednak to nie działa poprawnie, wszelkie sugestie, jak mogę poprawnie przekazać to jako argument?

Odpowiedz

13

Myślę, że prawdopodobnie chcesz tutaj, jest 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()); 
} 

Aktualizacja obejmuje comments from David Rodriguez:

Zauważ, że shared_from_this() powinien nigdy nazwać na obiekcie, który nie jest już zarządzany przez shared_ptr. To jest ważne:

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

Podczas następujące prowadzi do nieokreślonego zachowania (próbując wywołać delete na a):

A a; 
a.createB(); 
+0

dziękuję Andrzeja! – RdR

+7

Należy zauważyć, że 'shared_from_this()' wymaga, aby bieżący obiekt był już zarządzany w 'shared_ptr'. To znaczy. 'int main() {A a; a.createB(); } 'jest niezdefiniowanym zachowaniem, podczas gdy' int main() {shared_ptr a (nowy A); a-> createB(); } 'jest poprawne. –

+0

@ DavidRodríguez-dribeas Absolutnie. Odpowiednio zaktualizowałem odpowiedź. Dzięki. –