2009-04-29 5 views
6

Voir aussi: Similar questionComment devriez-vous retourner * ceci avec un shared_ptr?

Le code ci-dessous est évidemment dangereux. La question est: comment faites-vous le suivi de la référence à * ceci?

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(); 

J'ai la réponse (affichée ci-dessous), je veux juste qu'il soit sur stackoverflow (où tout le monde peut me corriger si je me trompe.)

+1

Vous ne savez pas pourquoi ceci a été rejeté .. à partir de la FAQ: Il est également très bien de poser et de répondre à votre propre question de programmation [..] –

+0

Le downvote peut bien avoir été parce que le code que vous avez posté dans la question compile pas. –

+0

Malheureusement, le but n'était pas de fournir un code compilable, mais plutôt d'illustrer le point avec des détails superflus. –

Répondre

7

La clé est d'étendre enable_shared_from_this<T> et utiliser la shared_from_this() méthode pour obtenir un shared_ptr à *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 pour l'article reliant l'explication –

1

quelques problèmes:
Votre code ne compile pas !!

Votre code n'est pas conçu d'une manière qu'il arrête un abus/usage incorrect:

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

Et maintenant?
Cela semble être un très bon cas d'utilisation!

+0

Votre 2ème point est juste sur. L'article lié dit "gardez à l'esprit que l'objet que vous appelez shared_from_this on doit appartenir à un objet shared_ptr." Il est préférable de rendre ctor private et de fournir un constructeur nommé (méthode statique) qui renvoie shared_ptr pour appliquer la création correcte. – Dan

Questions connexes