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_ptr
et shared_ptr
/ weak_ptr
fonctionne 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_ptr
presque 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_ptr
ne fonctionnerait pas à cause de getDevice()
, non? C'est donc le moment où j'utilise shared_ptr
et weak_ptr
? Pas moyen d'utiliser unique_ptr
? Il me semble que dans la plupart des cas, shared_ptr
cela 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_ptr
est correct dans 8/10 cas. Les 2/10 restants sont répartis entre unique_ptr
et weak_ptr
. En outre, weak_ptr
est 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.
device
membre de données? Vous devez d'abord en décider.
unique_ptr
place 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 Settings
classe, 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?
device
au constructeur desettings
, voulez-vous pouvoir toujours y faire référence dans la portée appelante, ou uniquement viasettings
? Si ce dernier,unique_ptr
est utile. Vous avez également un scénario dans lequel la valeur de retour degetDevice()
estnull
. Sinon, renvoyez simplement une référence.