2015-12-18 23 views
7

Arduino'm için bir program yazmaya çalışıyorum, ancak Item nesnesini başka bir Holder nesnesine geçirirken gerçekleşen bir şeyi anlamıyorum.C++, kopya kurucusu yerine varsayılan yapıcıyı çağırıyor

class Item { 
    public: 
    int property; 

    Item() { 
     Serial.println("parameterless constructor called"); 
     this->property = 2; 
    } 

    Item(int property) { 
     this->property = property; 
     Serial.println("right constructor called"); 
    } 
}; 

class Holder { 
    public: 
    Item someitem; 

    Holder(Item& someitem) { 
     this->someitem = someitem; 
    } 
}; 

void setup() { 
    Serial.begin(9600); 

    Item someitem = Item(1); 
    Serial.println(someitem.property); 

    Holder hold = Holder(someitem); 
    Serial.println(hold.someitem.property); 
} 

void loop() { 

} 

konsolda çıkışı: Ben oluşturarak değilim (parametresiz oluşturucu ilk etapta denir neden anlamıyorum

right constructor called 
1 
parameterless constructor called 
1 

Ben basit bir örnek inşa ettik Anlayışımın yeni bir nesnesi), ve neden mevcut nesneyi değiştirmediği ya da yeni bir şey yapmadığı. Parametersiz kurucuyu bırakmak derleyici tarafından engellenir. someitem ardından kullanmakta olduğunuz varsayılan inşa (yürütme yapıcı {} bloğunu girmeden önce) ilk, Kodunuzda

Holder(Item const& someitem) : someitem(someitem) {} 

: member initializer lists -

+1

"Derleyici tarafından parametrelenmemiş kurucunun önlenmesi kesilir" olduğunda, derleyici tarafından verilen hataları düzeltmelisiniz. –

+0

@ DieterLücking O yaptı, ama yanlış yol :) – Roddy

cevap

15

Sence sınıf C üyelerini ++ başlatmak nasıl unuttu atama operatörü.

Kurucu kopyalamıyor (ve zaten yapılandırılmış nesnede olamaz).

+2

Teşekkürler! Bu çalışır ve daha fazla okumaya işaret etti. Hala javada çok düşünüyorum düşünüyorum ... – Dominik

İlgili konular