2009-04-29 11 views
6

Vedere anche: Similar questionCome dovresti restituire * questo con un shared_ptr?

Il seguente codice è ovviamente pericoloso. La domanda è: come fai a tenere traccia del riferimento a * questo?

using namespace boost; 

// MyClass Definition 
class MyClass { 

public: 
    shared_ptr<OtherClass> createOtherClass() { 
     return shared_ptr<OtherClass> OtherClass(this); // baaad 
    } 
    MyClass(); 
    ~MyClass(); 
}; 

// OtherClass Definition 
class OtherClass { 

public: 
    OtherClass(const *MyClass myClass); 
    ~OtherClass(); 
}; 

// Call; pMyClass refcount = 1 
shared_ptr<MyClass> pMyClass(new MyClass()); 

// Call; pMyClass refcount = 1 => dangerous 
pMyClass->createOtherClass(); 

ho la risposta (postato qui sotto), voglio solo che sia su StackOverflow (dove tutti mi può correggere se sbaglio.)

+1

Non sono sicuro del motivo per cui questo è stato votato giù ... dalle FAQ: è anche perfettamente corretto chiedere e rispondere alla propria domanda di programmazione [..] –

+0

Il downvote potrebbe essere stato perché il codice che hai postato nella domanda ha vinto Compilare –

+0

Sfortunatamente, il punto non era fornire codice compilabile ma, al contrario, illustrare il punto con elimini dettagli inutili. –

risposta

7

La chiave è di prolungare enable_shared_from_this<T> e utilizzare il shared_from_this() metodo per ottenere uno shared_ptr per *this

For detailed information

using namespace boost;  

// MyClass Definition 
class MyClass : public enable_shared_from_this<MyClass> { 

public: 
    shared_ptr< OtherClass> createOtherClass() { 
     return shared_ptr<OtherClass> OtherClass(shared_from_this()); 
    } 
    MyClass(); 
    ~MyClass(); 
}; 

// OtherClass Definition 
class OtherClass { 

public: 
    OtherClass(shared_ptr< const MyClass > myClass); 
    ~OtherClass(); 
}; 

// Call; pMyClass refcount = 1 
shared_ptr<MyClass> pMyClass(new MyClass()); 

// Call; pMyClass refcount = 2 
pMyClass->createOtherClass(); 
+0

+1 per articolo che collega la spiegazione –

1

un paio di problemi:
Il tuo codice non viene compilato !!

Il tuo codice non è stato progettato in un modo che non si arresta l'abuso/uso scorretto:

MyClass   x; 
SharedPtr<MyClass> y = x.createOtherClass(); 

Ora che cosa?
Questo sembra un caso d'uso perfetto!

+0

Il tuo secondo punto è giusto. L'articolo collegato dice "tieni presente che l'oggetto che chiami shared_from_this on deve essere di proprietà di un oggetto shared_ptr." È preferibile rendere privato Ctor e fornire un costruttore denominato (metodo statico) che restituisce shared_ptr per applicare la creazione corretta. – Dan

Problemi correlati