Ho scritto un metodo factory statico che restituisce un nuovo oggetto Foobar popolato da un altro oggetto dati. Recentemente sono stato ossessionato dalla semantica della proprietà e mi sto chiedendo se sto trasmettendo il messaggio giusto facendo in modo che questo metodo di fabbrica restituisca un unique_ptr
.In pratica non è possibile restituire unique_ptr per il puntatore come la semantica della proprietà?
class Foobar {
public:
static unique_ptr<Foobar> factory(DataObject data);
}
Il mio intento è di dire al codice client di essere il proprietario del puntatore. Senza un puntatore intelligente, vorrei semplicemente restituire Foobar*
. Vorrei, tuttavia, far rispettare questa memoria per evitare potenziali bug, quindi unique_ptr
sembrava una soluzione appropriata. Se il cliente desidera estendere la durata del puntatore, chiama semplicemente .release()
una volta ottenuto il numero unique_ptr
.
Foobar* myFoo = Foobar::factory(data).release();
La mia domanda è disponibile in due parti:
- Questo approccio trasmettere la semantica di proprietà corrette?
- È una "cattiva pratica" restituire
unique_ptr
anziché un puntatore non elaborato?
stai tornando un unqiue_ptr per dire al cliente che possiedono il puntatore? Questo è esattamente l'opposto di quello che mi aspetterei (dal momento che devono prendere esplicitamente la proprietà del puntatore univoco). – jknupp
Si potrebbe preferire usare move-semantics (se si è in grado di usare C++ 11). Con questo, spetta all'utente decidere come prolungare la durata dell'oggetto creato dalla fabbrica. – evnu
@evnu è qualcosa che viene fatto automaticamente per te, no? –