2016-11-03 63 views
5

İnanılmaz derecede şifreli başlık için özür dilerim.Bir kurucudaki üye ilklendirmesini kullanarak açık bir yapıcının argümanını karşılamak neden sorun değil?

Herb Sutter tarafından "Daha Olağanüstü C++" okuyordum ve "sayılan bir işaretçi" nin bir örneğine rastladım, tüm kodu yapıştırmayacağım, ancak imzayla açık bir kurucu kullanıyor:

explicit countedPointer(P* obj): p(new impl(obj)) {} 

Bundan başka, o şekilde kendi sayılır işaretçiyi başlatırken, bu sınıfın yapıcısında, sınıf özel bir üyesi olarak sayılır işaretçi nesnesi olan bir sınıf bildirir:

flagNth(n):pimpl_(new flagNthImpl(n)) {} 

, pimpl_, karşı işaretçi nesnesi, yani

countedPointer<flagNthImpl>pimpl_; 

Bu kodu ve main.cpp içine kaçmaya çalıştı, ben (kurucu açık olduğundan, belli ki) ben

int main(int argc, const char * argv[]) 
{ 
    countedPointer<int> cp = new int(5); 
} 

Benim sorum bir hata alıyorum aşağıdakileri yapın denerseniz, Bunun yerine, bir kurucunun üye başlangıç ​​listesi içinde bunu yapmak neden sorun değil? Başlatma, bir şekilde düzenli bir başlangıçtan farklıdır ve eğer öyleyse, nasıl?

Teşekkür ederiz!

+2

' pimpl_ ((n) yeni flagNthImpl) (yeni int (5))' – NathanOliver

+0

'countedPointer cp = new int (5); '' bir atama değil, bir başlatma olan countedPointer cp (new int (5)); 'sınıf sözdizimi ile aynıdır ve çalışmalıdır. – djgandy

+3

@djgandy Bu kesinlikle bir atama değil **. Bu, kopyalamanın başlatılmasıdır, ancak yine de ** initialisation **. – Angew

cevap

6

Bu main sizin için de kullanılabilir:

countedPointer<int> cp(new int(5)); 

O direkt başlatma var ve normalde yapıcı çağırmak olacaktır. kopya başlatma var

countedPointer<int> cp = new int(5); 

, ve açık kurucular ile çalışmaz:

Ancak, bunu yapıyoruz. Eğer (ilk örnek gibi) direkt başlatmayı kullanılarak kapalı genellikle daha iyi konum, Tabii

countedPointer<int> cp = countedPointer<int>(new int(5)); 

veya doğrudan liste hazırlama:: başarıyla açık bir kurucu ile kopya başlatma kullanmak için, bu gerekiyordu

`countedPointer cp 'ile aynıdır
countedPointer<int> cp{new int(5)}; 
+0

Ah kullanılamaz kapalı bir dönüşüm gerektirir, bu mantıklı. Yani bir kurucu içindeki bir nesnenin üye ilklendirmesi esas olarak doğrudan başlatılıyor mu? – rmadhwal

+0

@rmadhwal Evet, bir mem-başlatıcı listesinin içindeki başlatma her zaman doğrudan başlatma veya doğrudan liste başlatmasıdır. – Angew

İlgili konular