Contenitori e proprietà condivisa all'interno di un'istanza di classe

0

Ho due oggetti come variabili membro di una classe.

std::unique_ptr<Object> specificObject;
std::vector<std::unique_ptr<Object>> objects;

So che specificObject sarà sempre all'interno di objects . Come posso indicare specificObject senza utilizzare shared_ptr s poiché non voglio che la proprietà degli oggetti nel contenitore sia considerata condivisa? Si tratta di un caso in cui è possibile utilizzare un puntatore non elaborato oppure è shared_ptr la soluzione?

    
posta sydan 07.01.2016 - 20:28
fonte

1 risposta

1

In un mondo ideale, tutti i puntatori proprietari sono puntatori intelligenti e i puntatori non proprietari grezzi vengono utilizzati solo quando NULL è considerato un valore potenzialmente valido. Se è vero che specificObject sarà sempre essere in objects , allora almeno in teoria dovrebbe essere possibile rendere specificObject un riferimento a Object , permettendo così al compilatore di imporre che ha sempre un valore non NULL per tutta la sua durata.

In un mondo tutt'altro che ideale, potrebbe non essere possibile o addirittura possibile inizializzare specificObject per puntare a un membro di objects , a seconda di come esattamente specificObject è determinato e se tale logica può ragionevolmente essere constexpr 'd. Quindi la domanda si riduce a qualunque sia la durata di tutte le Object s all'interno di objects . Se sai che continueranno a esistere almeno finchè specificObjects lo fa, allora un puntatore raw non proprietario è perfettamente sicuro. Sospetto che questa sia la situazione più tipica.

In un mondo molto non ideale, potrebbe essere possibile per objects guadagnare e perdere i suoi membri in qualsiasi momento, quindi è necessario tenere conto della possibilità che specificObject venga invalidato mentre il tuo programma è ancora cercando di fare cose con esso. In questo caso, weak_ptr è lo strumento di scelta, in quanto è specificamente progettato per situazioni in cui non si sa quando la vita dell'oggetto potrebbe terminare, ma non si vuole prolungarla inutilmente. Ovviamente, ciò richiederebbe la modifica di tutti i unique_ptr s in shared_ptr s, e non sorprende che sia il meno intuitivo dei puntatori intelligenti, motivo per cui sto menzionando questa opzione per ultimo.

    
risposta data 07.01.2016 - 20:48
fonte

Leggi altre domande sui tag