J'ai du mal à comprendre l'utilisation des pointeurs intelligents en tant que membres de classe dans C ++ 11. J'ai beaucoup lu sur les pointeurs intelligents et je pense comprendre comment unique_ptret shared_ptr/ weak_ptrfonctionne en général. Ce que je ne comprends pas, c'est l'usage réel. Il semble que tout le monde recommande de l'utiliser unique_ptrpresque tout le temps. Mais comment pourrais-je implémenter quelque chose comme ceci:
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...
}
Disons que je voudrais remplacer les pointeurs par des pointeurs intelligents. Un unique_ptrne fonctionnerait pas à cause de getDevice(), non? C'est donc le moment où j'utilise shared_ptret weak_ptr? Pas moyen d'utiliser unique_ptr? Il me semble que dans la plupart des cas, shared_ptrcela a plus de sens, sauf si j'utilise un pointeur dans une très petite portée?
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...
}
Est-ce la voie à suivre? Merci beaucoup!
shared_ptrest correct dans 8/10 cas. Les 2/10 restants sont répartis entre unique_ptret weak_ptr. En outre, weak_ptrest généralement utilisé pour casser des références circulaires; Je ne suis pas sûr que votre utilisation soit considérée comme correcte.
devicemembre de données? Vous devez d'abord en décider.
unique_ptrplace et abandonner la propriété lors de l'appel du constructeur, si je sais que je n'en aurai plus besoin pour le moment. Mais en tant que concepteur de la Settingsclasse, je ne sais pas si l'appelant souhaite également conserver une référence. Peut-être que l'appareil sera utilisé dans de nombreux endroits. Ok, c'est peut-être exactement votre point. Dans ce cas, je ne serais pas le seul propriétaire et c'est à ce moment-là que j'utiliserais shared_ptr, je suppose. Et: les points intelligents remplacent donc les pointeurs, mais pas les références, non?
deviceau constructeur desettings, voulez-vous pouvoir toujours y faire référence dans la portée appelante, ou uniquement viasettings? Si ce dernier,unique_ptrest utile. Vous avez également un scénario dans lequel la valeur de retour degetDevice()estnull. Sinon, renvoyez simplement une référence.