2012-02-16 11 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:もちろんです。あなた自身でコピーctorを定義しない限り、コンパイラはあなたのために1つを合成します。 – PlasmaHH

+0

@PlasmaHH:あなたは明示的にあなたの答えに言及すべきです、私はそれを完全に忘れていました:\ – amit

関連する問題