2010-12-20 18 views
16

enable_shared_from_this<Base> kullanıyorum ve Base'dan devralıyorum. 'un Derived yapıcısını (başlatıcı listesi değil) kullanmaya çalışırken, bir istisna alıyorum. Dahili zayıf işaretçinin boş olduğunu ve this'a işaret etmediğini ortaya çıkarır. Bu nasıl olabilir? Diğer kullanım durumum tam olarak mükemmel çalışıyor. Nereden başlayacağımı bile bilmiyorum. enable_shared_from_this kaynak koduna baktım ve bana o işaretçi her zaman nullptr gibi görünüyor.enable_shared_from_this - boş iç zayıf işaretçi?

+1

Gerçekten bir kopya: http://stackoverflow.com/questions/4428023/enable-shared-from-this-c0x-what-am-i-doing-wrong –

cevap

34

Nesnenin yapıcısında shared_from_this()'u arayamazsınız. shared_from_this(), nesnenin en az bir shared_ptr'a ait olmasını gerektirir. Bir nesne, oluşturulmadan önce bir shared_ptr'a ait olamaz.

shared_ptr nesnenin ilk kez sahipliğini aldığında, iç zayıf göstericinin ayarlandığını tahmin ediyorum. Bu noktadan önce, zayıf göstericinin referans gösterebileceği bir referans sayısı yapısı yoktur.

5

James McNellis's answer doğrudur. this page altındaki gözlemlemek şey yapması görünen enable_shared_from_this şablonun kendisi, not 7'nin açıklama gelince

açıklıyor:

... şablon enable_shared_from_this bir weak_ptr nesneyi tutar Bu, türetilmiş nesneyi işaret eder. tavuk ve yumurta problemi, ile ilgili shared_ptr nesnesinin olmadığı zaman nesnesinin nasıl başlatılacağı ile ilgilidir. Uygulama hüner shared_ptr için kurucular hakkında enable_shared_from_this biliyoruz ve bir kamu temel sınıf olarak enable_shared_from_this olan bir kaynağın sahibi bir shared_ptr nesne inşaatı sırasında weak_ptr nesneyi set olmasıdır.

1

Kavramsal olarak, shared_from_this()this bir shared_ptr işaret alır ve bir kopyasını döndürür.

Kurucuda, this işaret eden shared_ptr yoktur.

İlgili konular