2012-02-16 4 views
10

는 다음 예에서 봐 주시기 바랍니다 :파생 클래스에서 기본 생성자없이 복사 생성자를 선언하는 방법은 무엇입니까?

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; } 
}; 

이 코드는 기본 클래스에 대한 기본 생성자가 없음을 나에게 오류를 던지고 유지합니다. 내가 그것을 선언 할 때 모든 것이 괜찮습니다. 하지만 내가하지 않으면 코드가 작동하지 않습니다.

기본 클래스에서 기본 생성자를 선언하지 않고 파생 클래스에서 복사 생성자를 선언하려면 어떻게해야합니까?

Thnaks. 난 단지 그 사본의 ctor를 호출하기 때문에 파생 된 매개 변수에 기본 매개 변수를 설정

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

참고 :

+2

일단 매개 변수화 된 생성자가 있으면 컴파일러는 클래스의 기본 생성자를 제공하지 않습니다. – aProgrammer

답변

14

전화 (컴파일러에 의해 생성)를 복사 생성자를 원하지 않았다 생성 된 복사 생성자. 다른 생성자를 호출하는 것을 생각하지 마십시오. 나는 그것이 나쁜 생각이라고 생각한다.

+0

'Base (Base)'가 정의되지 않았습니다 – amit

+1

@amit :'Base (Base const &)'가 컴파일러에 의해 생성됩니다! – Nawaz

+1

감사합니다. 완전히 잊어 버렸습니다. 귀하의 편집은 그것을 분명히합니다. +1. – amit

4

당신은 (그리고해야)처럼, 기본 클래스의 복사의 ctor를 호출 할 수 있습니다.

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

그리고 이상적으로, 당신은 컴파일러를 호출해야하지만 어쩌면 당신은 정말베이스의 복사 ctor에 ...

+1

'Base (Base const &)'는입니다. 컴파일러에 의해. –

+0

@amit : 물론 그렇습니다. 당신이 복사기를 직접 정의하지 않는다면, 컴파일러는 당신을 위해 하나를 종합 할 것입니다. – PlasmaHH

+0

@PlasmaHH : 답안에 명시 적으로 언급해야합니다. \ – amit