Saya mengalami kesulitan memahami penggunaan pointer cerdas sebagai anggota kelas di C ++ 11. Saya telah membaca banyak tentang pointer cerdas dan saya pikir saya mengerti bagaimana unique_ptr
dan shared_ptr
/ weak_ptr
secara umum bekerja. Yang tidak saya mengerti adalah penggunaan sebenarnya. Sepertinya semua orang merekomendasikan menggunakan unique_ptr
sebagai cara untuk pergi hampir sepanjang waktu. Tetapi bagaimana saya mengimplementasikan sesuatu seperti ini:
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...
}
Katakanlah saya ingin mengganti pointer dengan pointer pintar. A unique_ptr
tidak akan bekerja karena getDevice()
, kan? Jadi saat itulah saya menggunakan shared_ptr
dan weak_ptr
? Tidak bisa menggunakan unique_ptr
? Menurut saya untuk kebanyakan kasus shared_ptr
lebih masuk akal kecuali saya menggunakan pointer dalam lingkup yang sangat kecil?
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...
}
Apakah itu cara untuk pergi? Terima kasih banyak!
shared_ptr
benar dalam 8/10 kasus. 2/10 lainnya dibagi antara unique_ptr
dan weak_ptr
. Juga, weak_ptr
umumnya digunakan untuk memecah referensi melingkar; Saya tidak yakin penggunaan Anda akan dianggap benar.
device
anggota data? Anda pertama-tama harus memutuskan itu.
unique_ptr
alih - alih dan menyerahkan kepemilikan ketika memanggil konstruktor, jika saya tahu saya tidak akan memerlukannya lagi untuk saat ini. Tetapi sebagai perancang Settings
kelas saya tidak tahu apakah penelepon ingin menyimpan referensi juga. Mungkin perangkat itu akan digunakan di banyak tempat. Ok, mungkin itu maksud Anda. Dalam hal ini, saya tidak akan menjadi pemilik tunggal dan saat itulah saya akan menggunakan shared_ptr, saya kira. Dan: poin yang sangat pintar menggantikan pointer, tetapi bukan referensi, bukan?
device
ke konstruktorsettings
, apakah Anda ingin tetap dapat merujuknya dalam lingkup panggilan, atau hanya melaluisettings
? Jika yang terakhir,unique_ptr
berguna. Juga, apakah Anda memiliki skenario di mana nilai baliknyagetDevice()
adalahnull
. Jika tidak, cukup kembalikan referensi.