Nerede bir sınıf ve bu sınıfta bir başlatma yöntemi var bu mevcut kodu var. Sınıfın nesnesi oluşturulduktan sonra, bu nesneye onun üzerinde başlat çağrısı yapmaları beklenir.
Başlatma yönteminin var olmasının nedeni Nesne genel bir kapsama sahip olmak için erken oluşturulur ve sonra başlatma yöntemi daha sonra bağımlı olduğu bir dll yüklendikten sonra çağrılır.
Başlatma işlemiyle ilgili sorun Sınıf artık, ilerlemeden önce her yöntemde kontrol edilmesi gereken ve başlatılmamışsa hata döndüren bu boole isInitialized'e sahip. Basitçe söylemek gerekirse, bu büyük bir acıdır.
Olası bir çözüm Yapıcıda başlat. Global kapsamda nesneye sadece bir işaretçi var. Dll yüklendikten sonra gerçek nesneyi oluşturun.
Yukarıdaki çözümle ilgili sorun Bu sınıfın bir nesnesini oluşturan herkes, yalnızca dll yüklendikten sonra oluşturulması gerektiğini bilmelidir, aksi takdirde başarısız olur.
Bu kabul edilebilir mi?
call_once
. Henüz C ++ 11 üzerinde olmayan projeler, call_once'un C ++ 11'de nasıl uygulandığını (çözdüğü soruna ve sonra nasıl yapıldığına odaklan) incelemeli ve sonra C ++ 'ın (eski) lezzetinde yeniden uygulamalıdır. Durumunun statik olarak başlatılması gereken (sabit bir değerle) çok iş parçacıklı güvenli bir senkronizasyon ilkesine ihtiyacı vardır. C ++ 11 öncesi derleyicilerin karşılanması gereken başka özdeşliklere sahip olabileceğini unutmayın.