2008-09-13 15 views
-3

Yakında bir yazı yazacağım my blog, Ama emin olmak istiyorum bir daha bir şey kaçırmadın.C++ Quiz - Singletons

Çözdüğüm bir örnek bulun ve sizi gönderiimde alıntılarım.

Konu tekil uygulamalarda başarısız oldu: Hangi durumlarda kazara tekil birden çok örneği alabilir misiniz? aslında ayrı sınıflar - Birden Dll veya DLL ve bir singleton yürütülebilir

  • Şablon tanımı içine instance()
  • Ana ilk çağrı

    • Yarış Durumu:

      Şimdiye kadar, ben ile geldim

    Eksik olduğum başka yollar - belki mirası ile mi?

  • +0

    Gönderide bu gönderide bilgi kullanmak istediğim için tam açıklama olduğunu hissettim. Üzgünüm, bunu yaparken komik hissettim, ama ilginç bir soru olmaya devam ediyor, değil mi? – theschmitzer

    +0

    Gönderi doldu. Teşekkürler. – theschmitzer

    cevap

    3

    Cpp dosyanızda başlattığınız statik bir örnek alanı kullanıyorsanız, bazı statik/global başlatmaları, tekil bir örneğini almaya çalışırsa, birden fazla örneği (ve hatta daha kötü davranış) alabilirsiniz. Bunun nedeni, derleme birimlerindeki statik başlatma sırasının tanımsız olmasıdır.

    +0

    Yani söyleyeceğiniz şey, _instance tarafından kullanılan genel bellek NULL olarak başlatıldı, diğer bir global değişken çağrı örneği() örnek # 1 tahsis edildi, sonra açık _instance başlatıcısı yürütülür, NULL olarak ayarlanır ve sonraki çağrı örneğine döndürülür() ikinci kez ayırır? – theschmitzer

    +0

    Bu durumda, global bellek üyelerinin başlatılmasından önce global bellek neye benziyor? – theschmitzer

    +0

    Buradaki nokta, genel belleğin ana bilgisayardan önce NULL olarak başlatılmasıdır, ancak bir singleton örneği istemeden önce zorunlu değildir. –

    1

    Miras, özel olarak bulunduğu sürece bir sorun olmamalıdır. Ancak, kopya oluşturucuya izin vermezseniz, kullanıcılar tekil örneği kasıtlı olarak kopyalayabilirler. Özel olarak boost::noncopyable'dan miras almak, bunu önlemenin en kolay yoludur.

    +0

    Kalıtım kullanmak yerine, iki sorunlu yöntemi özel olarak bildirmek daha iyidir. Getirmek istemiyorsanız ve kalıtım (hem küçük maliyetler, hem de bilmek iyi) kullanmak istiyorsanız, destekleme dahil edilir. – hazzen

    +0

    Bu da geçerli bir seçenek ve ne yapardım. Bunu neden alternatif bir cevap olarak göndermiyorsunuz? BTW, daha iyi subjektiftir ... boost :: noncopyable yöntemi, belirli bir satır numarası ile bir derleyici hatası verir. Yöntemeniz, yeni başlayanların izini sürmek için daha zor olabilen bir bağlantı zamanı hatası verir. –