C ++ 11 sınıf üyeleri olarak akıllı işaretçi kullanımını anlamakta sorun yaşıyorum. Akıllı işaretçiler hakkında çok şey okudum unique_ptrve genel olarak nasıl ve shared_ptr/ nasıl weak_ptrçalıştığını anladığımı düşünüyorum . Anlamadığım şey gerçek kullanımdır. Herkesin unique_ptrneredeyse her zaman gitmek için bir yol olarak kullanılmasını önerdiği görülüyor . Ama böyle bir şeyi nasıl uygularım:
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...
}
İşaretçileri akıllı işaretçilerle değiştirmek istediğimi varsayalım. Bir unique_ptrnedeniyle değil iş olur getDevice(), doğru? Yani o zaman shared_ptrve weak_ptr? Kullanmanın yolu yok unique_ptrmu? Bana shared_ptrgerçekten küçük bir kapsamda bir işaretçi kullanmadığı sürece çoğu durumda daha mantıklı gibi görünüyor ?
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...
}
Gidilecek yol bu mu? Çok teşekkürler!
shared_ptr8/10 vakalarında a doğrudur. Diğer 2/10 ise unique_ptrve arasında bölünür weak_ptr. Ayrıca, weak_ptrgenellikle dairesel referansları kırmak için kullanılır; Kullanımınızın doğru kabul edileceğinden emin değilim.
deviceveri üyesi için hangi sahipliği istersiniz ? Önce buna karar vermelisin.
unique_ptrbunun yerine kullanacağımı ve yapıcıyı çağırırken sahipliğini bırakabileceğimi anlıyorum , eğer şimdi buna ihtiyacım olmayacağını biliyorum. Ama Settingssınıfın tasarımcısı olarak arayanın da bir referans tutmak isteyip istemediğini bilmiyorum. Belki cihaz birçok yerde kullanılacaktır. Tamam, belki de bu tam olarak sizin açınızdan. Bu durumda, ben tek sahibi olmaz ve o zaman paylaşılan_ptr kullanmak istiyorum, sanırım. Ve: akıllı noktalar işaretçilerin yerini alır, ancak referansları değil, değil mi?
device, yapıcısına geçtikten sonra,settingshala arama kapsamında veya yalnızca üzerinden başvuruda bulunabilmek istersettingsmisiniz? İkincisi,unique_ptrfaydalıdır. Ayrıca, dönüş değeri nerede bir senaryo vargetDevice()olduğununull. Değilse, sadece bir referans gönderin.