2009-04-29 14 views
6

Véase también: Similar question¿Cómo debería devolver * esto con un shared_ptr?

El código siguiente es obviamente peligroso. La pregunta es: ¿cómo se hace un seguimiento de la referencia a * esto?

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

tengo la respuesta (publicado más adelante), sólo quiero que sea en StackOverflow (donde todo el mundo me puede corregir si estoy equivocado.)

+1

No estoy seguro de por qué se rechaza esto .. de las preguntas frecuentes: también está perfectamente bien preguntar y responder a su propia pregunta de programación [..] –

+0

El voto a favor puede ser porque el código que ha publicado en la pregunta ganó compilar –

+0

Desafortunadamente, el objetivo no era proporcionar un código compilable sino, por el contrario, ilustrar el punto con detalles innecesarios elididos. –

Respuesta

7

La clave es extender enable_shared_from_this<T> y el uso de la shared_from_this() método para obtener un shared_ptr a *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 para el artículo que vincula la explicación –

1

un par de problemas:
¡Tu código no se compila!

El código no está diseñado de una manera que se detenga el abuso/uso incorrecto:

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

Ahora qué?
¡Esto parece un caso de uso perfectamente bueno!

+0

Su segundo punto está en lo cierto. El artículo vinculado dice "tenga en cuenta que el objeto al que llama shared_from_this on debe ser propiedad de un objeto shared_ptr". Lo mejor es hacer que ctor sea privado y proporcionar el constructor nombrado (método estático) que devuelve shared_ptr para imponer la creación correcta. – Dan

Cuestiones relacionadas