Mi trovo spesso nella situazione in cui voglio prendere in giro un oggetto non copiabile, ad esempio un handle DbHandle
.
Stavo andando avanti e indietro guardando diverse scelte di design, e ho optato per il seguente disegno:
Nel mio codice di produzione, non è necessario che un client di Repository
conosca l'oggetto DbHandle
, ma per i test di unità, questo oggetto DbHandle
è esattamente quello che voglio prendere in giro.
Ho optato per unique_ptr
perché chiariscono che Respository
possiede DbHandle
, anche se è stato creato all'esterno.
#include <memory>
class Repository {
public:
Repository() : d_dbHandel(std::unique_ptr<DbHandel>(new DbHandle("default"))) {
d_dbHandel->open("myDB");
}
Repository(std::unique_ptr<DbHandle> DbHandle) :
d_dbHandel(std::move(DbHandle) {
}
inline DbHandle& getDbHandel() {
return *d_dbHandel;
}
private:
std::unique_ptr<DbHandel> d_dbHandel;
};
Quali sono alcuni dei difetti di questo approccio?