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_ptr
y shared_ptr
/ o weak_ptr
trabajo en general. Lo que no entiendo es el uso real. Parece que todo el mundo recomienda usarlo unique_ptr
como 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_ptr
no funcionaría por getDevice()
, ¿verdad? ¿Entonces es el momento en que uso shared_ptr
y weak_ptr
? No hay forma de usar unique_ptr
? Me parece que para la mayoría de los casos shared_ptr
tiene 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_ptr
es correcto en 8/10 casos. Los otros 2/10 se dividen entre unique_ptr
y weak_ptr
. Además, weak_ptr
generalmente se usa para romper referencias circulares; No estoy seguro de que su uso se considere correcto.
device
miembro de datos? Primero tienes que decidir eso.
unique_ptr
lugar y ceder la propiedad al llamar al constructor, si sé que ya no lo necesitaré por ahora. Pero como diseñador de la Settings
clase, 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?
device
al 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_ptr
es útil. Además, ¿tiene un escenario donde el valor de retorno degetDevice()
esnull
. Si no, solo devuelva una referencia.