Tengo problemas para entender el uso de punteros inteligentes como miembros de clase en C ++ 11. He leído mucho sobre punteros inteligentes y creo que entiendo cómo unique_ptry shared_ptr/ o weak_ptrtrabajo en general. Lo que no entiendo es el uso real. Parece que todo el mundo recomienda usarlo unique_ptrcomo el camino a seguir casi todo el tiempo. Pero, ¿cómo implementaría algo como esto?
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...
}
Digamos que me gustaría reemplazar los punteros con punteros inteligentes. A unique_ptrno funcionaría por getDevice(), ¿verdad? ¿Entonces es el momento en que uso shared_ptry weak_ptr? No hay forma de usar unique_ptr? Me parece que para la mayoría de los casos shared_ptrtiene más sentido a menos que esté usando un puntero en un alcance realmente pequeño.
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...
}
¿Es ese el camino a seguir? ¡Muchas gracias!
shared_ptres correcto en 8/10 casos. Los otros 2/10 se dividen entre unique_ptry weak_ptr. Además, weak_ptrgeneralmente se usa para romper referencias circulares; No estoy seguro de que su uso se considere correcto.
devicemiembro de datos? Primero tienes que decidir eso.
unique_ptrlugar y ceder la propiedad al llamar al constructor, si sé que ya no lo necesitaré por ahora. Pero como diseñador de la Settingsclase, no sé si la persona que llama también quiere mantener una referencia. Tal vez el dispositivo se utilizará en muchos lugares. Ok, tal vez ese es exactamente tu punto. En ese caso, no sería el único propietario y es cuando usaría shared_ptr, supongo. Y: entonces los puntos inteligentes reemplazan los punteros, pero no las referencias, ¿verdad?
deviceal constructor desettings, ¿desea poder seguir refiriéndose a él en el ámbito de la llamada, o solo a través desettings? Si este último,unique_ptres útil. Además, ¿tiene un escenario donde el valor de retorno degetDevice()esnull. Si no, solo devuelva una referencia.