Estou tendo problemas para entender o uso de ponteiros inteligentes como membros da classe em C ++ 11. Eu li muito sobre ponteiros inteligentes e acho que entendo como unique_ptr
e shared_ptr
/ weak_ptr
trabalho em geral. O que eu não entendo é o uso real. Parece que todo mundo recomenda usar unique_ptr
o caminho a percorrer quase o tempo todo. Mas como eu implementaria algo assim:
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 eu gostaria de substituir os ponteiros por ponteiros inteligentes. A unique_ptr
não funcionaria por causa de getDevice()
, certo? Então é nessa hora que eu uso shared_ptr
e weak_ptr
? Não tem como usar unique_ptr
? Parece-me que, na maioria dos casos, shared_ptr
faz mais sentido, a menos que eu esteja usando um ponteiro em um escopo muito pequeno?
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...
}
Aquele é o caminho para ir? Muito obrigado!
shared_ptr
está correto em 8/10 casos. Os outros 2/10 são divididos entre unique_ptr
e weak_ptr
. Além disso, weak_ptr
é geralmente usado para quebrar referências circulares; Não tenho certeza de que seu uso seria considerado correto.
device
membro de dados? Você primeiro tem que decidir isso.
unique_ptr
e renunciar à propriedade ao chamar o construtor, se eu souber que não precisarei mais dele por enquanto. Mas, como designer da Settings
classe, não sei se o chamador também quer manter uma referência. Talvez o dispositivo seja usado em muitos lugares. Ok, talvez esse seja exatamente o seu ponto. Nesse caso, eu não seria o único proprietário e é aí que eu usaria o shared_ptr, eu acho. E: pontos inteligentes substituem ponteiros, mas não referências, certo?
device
para o construtor desettings
, você ainda pode se referir a ele no escopo da chamada ou apenas viasettings
? Se o último,unique_ptr
é útil. Além disso, você tem um cenário em que o valor de retornogetDevice()
énull
. Caso contrário, basta retornar uma referência.