Sto riscontrando problemi nel comprendere l'utilizzo dei puntatori intelligenti come membri della classe in C ++ 11. Ho letto molto sui puntatori intelligenti e penso di capire come unique_ptr
e shared_ptr
/ o weak_ptr
lavorare in generale. Quello che non capisco è il reale utilizzo. Sembra che tutti raccomandino di usarlo unique_ptr
come modo per andare quasi sempre. Ma come implementerei qualcosa del genere:
class Device {
};
class Settings {
Device *device;
public:
Settings(Device *device) {
this->device = device;
}
Device *getDevice() {
return device;
}
};
int main() {
Device *device = new Device();
Settings settings(device);
// ...
Device *myDevice = settings.getDevice();
// do something with myDevice...
}
Diciamo che vorrei sostituire i puntatori con puntatori intelligenti. A unique_ptr
non funzionerebbe a causa di getDevice()
, giusto? Quindi è il momento in cui uso shared_ptr
e weak_ptr
? Nessun modo di usare unique_ptr
? Mi sembra che per la maggior parte dei casi shared_ptr
abbia più senso se non sto usando un puntatore in un ambito davvero piccolo?
class Device {
};
class Settings {
std::shared_ptr<Device> device;
public:
Settings(std::shared_ptr<Device> device) {
this->device = device;
}
std::weak_ptr<Device> getDevice() {
return device;
}
};
int main() {
std::shared_ptr<Device> device(new Device());
Settings settings(device);
// ...
std::weak_ptr<Device> myDevice = settings.getDevice();
// do something with myDevice...
}
È questa la strada da percorrere? Grazie mille!
shared_ptr
è corretto in 8/10 casi. Gli altri 2/10 sono divisi tra unique_ptr
e weak_ptr
. Inoltre, weak_ptr
viene generalmente utilizzato per rompere i riferimenti circolari; Non sono sicuro che il tuo utilizzo sia considerato corretto.
device
membro dei dati? Devi prima decidere quello.
unique_ptr
invece e rinunciare alla proprietà quando chiamo il costruttore, se so che per ora non ne avrò più bisogno. Ma come progettista della Settings
classe non so se anche il chiamante vuole mantenere un riferimento. Forse il dispositivo verrà utilizzato in molti luoghi. Ok, forse è esattamente questo il punto. In tal caso, non sarei l'unico proprietario ed è allora che userò shared_ptr, immagino. E: quindi i punti smart sostituiscono i puntatori, ma non i riferimenti, giusto?
device
al costruttore disettings
, vuoi essere in grado di fare riferimento ad esso nell'ambito di chiamata o solo tramitesettings
? Se quest'ultimo,unique_ptr
è utile. Inoltre, hai uno scenario in cui il valore restituitogetDevice()
ènull
. In caso contrario, restituisci solo un riferimento.