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_ptre shared_ptr/ o weak_ptrlavorare in generale. Quello che non capisco è il reale utilizzo. Sembra che tutti raccomandino di usarlo unique_ptrcome 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_ptrnon funzionerebbe a causa di getDevice(), giusto? Quindi è il momento in cui uso shared_ptre weak_ptr? Nessun modo di usare unique_ptr? Mi sembra che per la maggior parte dei casi shared_ptrabbia 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_ptre weak_ptr. Inoltre, weak_ptrviene generalmente utilizzato per rompere i riferimenti circolari; Non sono sicuro che il tuo utilizzo sia considerato corretto.
devicemembro dei dati? Devi prima decidere quello.
unique_ptrinvece e rinunciare alla proprietà quando chiamo il costruttore, se so che per ora non ne avrò più bisogno. Ma come progettista della Settingsclasse 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?
deviceal 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.