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_ptre shared_ptr/ weak_ptrtrabalho em geral. O que eu não entendo é o uso real. Parece que todo mundo recomenda usar unique_ptro 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_ptrnão funcionaria por causa de getDevice(), certo? Então é nessa hora que eu uso shared_ptre weak_ptr? Não tem como usar unique_ptr? Parece-me que, na maioria dos casos, shared_ptrfaz 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_ptrestá correto em 8/10 casos. Os outros 2/10 são divididos entre unique_ptre 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.
devicemembro de dados? Você primeiro tem que decidir isso.
unique_ptre renunciar à propriedade ao chamar o construtor, se eu souber que não precisarei mais dele por enquanto. Mas, como designer da Settingsclasse, 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?
devicepara 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.