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_ptr
ve 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_ptr
neredeyse 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_ptr
nedeniyle değil iş olur getDevice()
, doğru? Yani o zaman shared_ptr
ve weak_ptr
? Kullanmanın yolu yok unique_ptr
mu? Bana shared_ptr
gerç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_ptr
8/10 vakalarında a doğrudur. Diğer 2/10 ise unique_ptr
ve arasında bölünür weak_ptr
. Ayrıca, weak_ptr
genellikle dairesel referansları kırmak için kullanılır; Kullanımınızın doğru kabul edileceğinden emin değilim.
device
veri üyesi için hangi sahipliği istersiniz ? Önce buna karar vermelisin.
unique_ptr
bunun 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 Settings
sı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,settings
hala arama kapsamında veya yalnızca üzerinden başvuruda bulunabilmek istersettings
misiniz? İkincisi,unique_ptr
faydalıdır. Ayrıca, dönüş değeri nerede bir senaryo vargetDevice()
olduğununull
. Değilse, sadece bir referans gönderin.