ho visto che un modo utile per scrivere un metodo clone che restituisce un boost :: shared_ptr è quello di fareCome Fare un metodo clone utilizzando shared_ptr e che eredita da 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));
}
};
Questo consente l'uso di covarianza con il puntatore regolare mentre lo si avvolge nella sicurezza di un puntatore intelligente. Il mio problema è che la mia classe B ha bisogno di ereditare da boost :: enable_shared_from_this perché subito dopo la costruzione ha bisogno di registrarsi con una classe separata, passando un puntatore condiviso a se stesso. Ho un metodo Create che avvolge la costruzione e la registrazione per assicurarci che si verifichino sempre insieme. L'implementazione del metodo clone di cui sopra non può tuttavia gestire questo requisito. La registrazione non può avvenire in CloneImpl dal momento che nessun shared_ptr esiste ancora "possedere" l'oggetto, impedendo una chiamata a shared_from_this(), e se questa logica non è in funzione virtuale poi uno shared_ptr che punta a B, non conosce le esigenze di registrazione di B quando clonato. Qual è il modo migliore per gestire questo problema?
Compilare questo codice? Sembra che B :: Clone() nasconda A :: Clone(). –
Questo esempio è stato compilato per me. Credo che sia intenzionale che B :: Clone() nasconda A :: Clone() in modo da ottenere il tipo di ritorno corretto. – user334066