Tengo una base simple y una clase derivada que quiero que ambas tengan shared_from_this()
.Cómo enable_shared_from_this de ambos padres y derivado
Esta solución simple:
class foo : public enable_shared_from_this<foo> {
void foo_do_it()
{
cout<<"foo::do_it\n";
}
public:
virtual function<void()> get_callback()
{
return boost::bind(&foo::foo_do_it,shared_from_this());
}
virtual ~foo() {};
};
class bar1 : public foo , public enable_shared_from_this<bar1> {
using enable_shared_from_this<bar1>::shared_from_this;
void bar1_do_it()
{
cout<<"foo::do_it\n";
}
public:
virtual function<void()> get_callback()
{
return boost::bind(&bar1::bar1_do_it,shared_from_this());
}
};
provoca excepción tr1::bad_weak_ptr
en siguiente código:
shared_ptr<foo> ptr(shared_ptr<foo>(new bar1));
function<void()> f=ptr->get_callback();
f();
Así que después de "googlear" He encontrado siguiente solución:
class bar2 : public foo {
void bar2_do_it()
{
cout<<"foo::do_it\n";
}
shared_ptr<bar2> shared_from_this()
{
return boost::static_pointer_cast<bar2>(foo::shared_from_this());
}
public:
virtual function<void()> get_callback()
{
return boost::bind(&bar2::bar2_do_it,shared_from_this());
}
};
Y ahora trabajos.
¿Hay alguna manera mejor y más conveniente y correcta de enable_shared_from_this
para padres y niños?
Gracias
he intentado implementar de forma manual, y en realidad no es tan difícil. En 'My :: SmartPointer', compruebe si T se deriva de 'My :: enableSmartFromThis'. Si es así, no asigne un contador de referencia en el montón, pero use los miembros de 'My :: enableSmartFromThis'. Ahora 'My :: GetSmartFromThis (this)' se vuelve trivial, puede convertir 'this' en' My :: enableSmartFromThis * 'y encontrar el recuento de referencias existente. Incluso puede verificar si está tratando de convertir de Base a Derivado cuando Derivado deriva de 'My :: enableSmartFromThis'. –
MSalters