2013-04-09 12 views
5

std::unique_ptr işaret ettiği nesneyi benzersiz olarak denetler ve bu nedenle referans sayımını kullanmaz. Tekil, referans sayımı kullanılarak sadece bir nesnenin oluşturulmasını sağlar.tekil kalıbı ve std :: unique_ptr

sonra std::unique_ptr bir singleton aynı işleyişi misiniz?

+5

Bu sonuca nasıl ulaştığınızı anlamıyorum! –

+3

Eh, bir 'std :: unique_ptr ' ... – juanchopanza

+0

Sftrabbit 'tekil' ilkesini karışık bir şekilde std :: unique_ptr 'ile karıştırdım.Açıklama sağlamak için hepinize teşekkür ederim. – Mushy

cevap

11

bir tekil bir tür yalnızca bir örneğini sağlamaktadır.

unique_ptrherhangi bir örneğe yalnızca bir akıllı işaretçi sağlar.

+0

İkinci ifadeniz mutlaka doğru değildir. –

+0

@PreetKukreti Cevabınıza katılıyorum. En kötü düşmanım olabilir ve ilk ifademin de mutlaka doğru olmadığını iddia edebilirim. Bu kodu çoğaltmak için de kaldırabilirsiniz. "Sağladıkları" önlemlerimi "sağlamaya yardımcı olacak önlemler" anlamına geldiğimi düşünün. * Belki de düzeltmeliyim ... * –

+0

Merak etme, seni yine de oy verdim, genel fikri oldukça kısaca anlatıyorsun :) –

0

Eğer yanılıyorsam düzeltin, ama bir singeltonu hatırladığım kadarıyla sadece bir örneği olan bir sınıf. Bu tamamen farklı. Yani hayır.

5

std :: unique_ptr tekil olarak aynı davranır mı?

Hayır, bir tek kişilik olması amaçlanan Foo sınıfımız olduğunu varsayalım. Tipik bir tektonik desen kullanarak, birden fazla Foo oluşturmanın yolu yoktur.

std::unique_ptr<Foo>'a sahip olmak, Foo'nun belirli bir örneğine bir işaretçi olacak demektir, ancak bu Foo'nun diğer örneklerinin oluşturulmasını engellemez (diğer unique_ptr s ile veya yerel değişkenlere ham işaretçilerle). Böylece, Foo, tek kişilik olmaz.

+0

Güzel illüstrasyon, ama 'unique_ptr' demek istedin, 'shared_ptr' değil? –

+0

Evet, yanlış yazdım. Düzenleme için teşekkürler. –

3

std::unique_ptr sadece bir hareket yapıcı ve hiçbir kopya yapıcı veya atama operatörü sağlayarak tek sahiplik anlambilim başarır.

Size aynı türden farklı örneklerini referans birden unique_ptrs olabileceğinden, tüm tekil bir durum değildir. Singleton, türü doğrudan oluşturmanıza izin vermez, ancak tek örneği yöneten bir erişimci sağlar. Ayrıca

,

o Drew'in iddiası "Bir unique_ptr herhangi örneğine tek akıllı işaretçi sağlıyor."

yanlıştır. sadece yaparsanız:

T* nt = new T; 
std::unique_ptr<T> up1(nt); 
std::unique_ptr<T> up2(nt); 

o zaman aynı kaynak sahibi iki eşsiz işaretçiler var - ve sadece çalışma zamanında bir sorun fark edecektir, derleme süresi değil. Elbette bu, unique_ptr'un yanlış kullanımıdır, ancak bu, unique_ptr'un size herhangi bir şey sağlamayacağını pekiştirir, sadece kendi perspektifinden tek sahibi olan bir işaretleyici konteynır ve api yoluyla, yanlışlıkla geçici kopyalar oluşturmayı zorlaştırır .

Ayrıca, bağımsız bir şekilde, herhangi bir unique_ptr aynı ham işaretçi/kaynak işaret diğer (akıllı) işaretçi türleri olabilir. Kaynaklarının sahiplik ve ömür boyu politikalarını ve akıllı işaretçi örneklerini tanımlamak için kullanılan kod tamamen kullanıma uygundur.