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_ptrdan shared_ptr/ weak_ptrsecara umum bekerja. Yang tidak saya mengerti adalah penggunaan sebenarnya. Sepertinya semua orang merekomendasikan menggunakan unique_ptrsebagai 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_ptrtidak akan bekerja karena getDevice(), kan? Jadi saat itulah saya menggunakan shared_ptrdan weak_ptr? Tidak bisa menggunakan unique_ptr? Menurut saya untuk kebanyakan kasus shared_ptrlebih 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_ptrbenar dalam 8/10 kasus. 2/10 lainnya dibagi antara unique_ptrdan weak_ptr. Juga, weak_ptrumumnya digunakan untuk memecah referensi melingkar; Saya tidak yakin penggunaan Anda akan dianggap benar.
deviceanggota data? Anda pertama-tama harus memutuskan itu.
unique_ptralih - alih dan menyerahkan kepemilikan ketika memanggil konstruktor, jika saya tahu saya tidak akan memerlukannya lagi untuk saat ini. Tetapi sebagai perancang Settingskelas 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?
deviceke konstruktorsettings, apakah Anda ingin tetap dapat merujuknya dalam lingkup panggilan, atau hanya melaluisettings? Jika yang terakhir,unique_ptrberguna. Juga, apakah Anda memiliki skenario di mana nilai baliknyagetDevice()adalahnull. Jika tidak, cukup kembalikan referensi.