2012-02-16 25 views
10

Aşağıdaki örnekte bir göz atın:Kopya oluşturucu, türetilmiş sınıfta, temelde varsayılan construcor olmadan nasıl bildirilir?

class Base 
{ 
protected: 
    int m_nValue; 

public: 
    Base(int nValue) 
     : m_nValue(nValue) 
    { 
    } 

    const char* GetName() { return "Base"; } 
    int GetValue() { return m_nValue; } 
}; 

class Derived: public Base 
{ 
public: 
    Derived(int nValue) 
     : Base(nValue) 
    { 
    } 
    Derived(const Base &d){ 
     std::cout << "copy constructor\n"; 
    } 

    const char* GetName() { return "Derived"; } 
    int GetValueDoubled() { return m_nValue * 2; } 
}; 

Bu kod temel sınıf için varsayılan contructor olduğunu bana bir hata atma tutar. Bunu ilan ettiğimde her şey yolunda. Ama yapmadığımda, kod çalışmıyor.

Temel sınıfta varsayılan contructor bildirmeden türetilmiş bir sınıftaki bir kopya oluşturucuyu nasıl bildirebilirim?

Yılanlar. Ben sadece bir kopya ctor denir, çünkü bir Türetilmiş parametresine Baz parametresini döndü

Derived(const Derived &d) : 
     Base(d) 
{ 
    std::cout << "copy constructor\n"; 
} 

Not:

+2

Derleyici, herhangi bir parametreli yapıcıya sahip olduğumuzda, sınıf için varsayılan yapıcıyı sağlamaz .. – aProgrammer

cevap

14

Çağrı (derleyici tarafından oluşturulur) kopyalamaya karşı yapıcı istedik vermedi tabanın oluşturulmuş kopya yapıcısı. Diğer kurucuyu aramayı düşünmeyin. Bence bu kötü bir fikir olur.

+0

'Base (Base)' tanımlı değil – amit

+1

@amit: 'Base (Base const &)' derleyici tarafından oluşturulacak! – Nawaz

+1

Teşekkürler, tamamen unuttu. Düzenlemeniz bunu netleştirir. +1. – amit

4

Sen (ve) gibi temel sınıf kopyası ctor çağırabilir.

Derived(const Derived &d) : Base(d) 
{   //^^^^^^^ change this to Derived. Your code is using Base 
    std::cout << "copy constructor\n"; 
} 

Ve en iyisi, sen derleyici çağırmalıdır: Ama belki gerçekten tabanının bir kopyasını ctor ...

+1

'Base (Base const &)' is. Derleyici tarafından. –

+0

@amit: elbette öyle. Bir kopya ctor'u kendiniz tanımlamazsanız, derleyici sizin için bir tane sentezleyecektir. – PlasmaHH

+0

@PlasmaHH: Cevabınızdan açıkça bahsetmelisiniz, bunu tamamen unutmuşum: \ – amit

İlgili konular