que he visto que una forma útil para escribir un método que devuelve un clon de impulso :: shared_ptr es hacerCómo hacer un método clon usando shared_ptr y heredando de enable_shared_from_this
class A
{
public:
shared_ptr<A> Clone() const
{
return(shared_ptr<A>(CloneImpl()));
}
protected:
virtual A* CloneImpl() const
{
return(new A(*this));
}
};
class B : public A
{
public:
shared_ptr<B> Clone() const
{
return(shared_ptr<B>(CloneImpl()));
}
protected:
virtual B* CloneImpl() const
{
return(new B(*this));
}
};
Esto permite el uso de covarianza con el puntero regular sin dejar de envolverlo en la seguridad de un puntero inteligente. Mi problema es que mi clase B necesita heredar de boost :: enable_shared_from_this porque justo después de la construcción necesita registrarse en una clase separada, pasando un puntero compartido a sí mismo. Tengo un método Create que envuelve la construcción y el registro para garantizar que siempre ocurran juntos. La implementación del método de clonación anterior no puede manejar este requisito, sin embargo. El registro no puede ocurrir en CloneImpl ya que todavía no existe shared_ptr que "posee" el objeto, impidiendo una llamada a shared_from_this(), y si esta lógica no está en la función virtual, shared_ptr apunta a B, no sabe acerca de las necesidades de registro de B cuando es clonado ¿Cuál es la mejor manera de manejar este problema?
¿Compila este código? Parece que B :: Clone() oculta A :: Clon(). –
Este ejemplo compilado para mí. Creo que es útil que B :: Clone() oculte A :: Clone() para que obtenga el tipo de devolución correcto. – user334066