2011-12-06 9 views
3

よくある質問ですが、コードが機能する方法を見つけることができないので、いくつかの助けを得ることができてうれしく思います。コード:C++エラー:適切なデフォルトのコンストラクタがありません

#include "stdafx.h" 
#include "iostream" 
#include "string" 
#include "cmath" 
#include "ctime" 
using namespace std; 
class quad{ 
    int Lice; 
public: 
    quad(int x, int z){ 
     Lice = x*z; 
    } 
    int ShowLice(){ 
     return Lice; 
    } 
}; 
class tri : public quad{ 
    int Lice; 
public: 
    tri(int a, int b, int c){ 
     Lice = a*b*c; 
    } 

}; 
int main(){ 
quad ob1(2,2); 
tri ob2(2,2,2); 
cout<<ob1.ShowLice(); 
cout<<ob2.ShowLice(); 

return 0; 
} 

私はVS2008を使用すると、コンパイラからのエラーは、次のとおりです。

project1.cpp(20) : error C2512: 'quad' : no appropriate default constructor available 

おかげで、Leron。

答えて

3

両方由来でシラミ部材とベースクラスを有することを

class quad{ 
protected: 
    int Lice; 
public: 
    quad(int x, int z){ 
     Lice = x*z; 
    } 
    int ShowLice(){ 
     return Lice; 
    } 
}; 
class tri : public quad{ 

public: 
    tri(int a, int b, int c) : quad(a,b) { 
     Lice *= c; 
    } 

}; 

ない点に変更し、それを。派生クラスと子クラスの両方が同じフィールドを再利用できるように保護します。

基本クラスにデフォルト以外のコンストラクタがある場合は、上に示したように、派生クラスコンストラクタの正しい引数を持つ基本クラスコンストラクタを呼び出す必要があります。

また、継承を使用する場合は、基本クラスにvirtual destructo rを指定することをお勧めします。問題は、あなたのサンプルコードで明らかではないかもしれません。

+0

ありがとうございます。 – Leron

2

あなたはtriの初期化子リストからquadのコンストラクタを呼び出す必要があります:

tri(int a, int b, int c) : quad(a,b) {... 
2

それが継承ツリーを上がり、クワッドを作成しようとするときは、タイプトリのクラスを構築します。 quadはデフォルトコンストラクタを持っていないのでできません。このエラーを修正するには、明示的にquadのコンストラクターを呼び出すか、呼び出されるデフォルトのコンストラクターを指定します。

コンストラクタが指定されていない場合、デフォルトコンストラクタが自動的に生成されますが、コンストラクタが定義されるとすぐにデフォルトコンストラクタは自動生成されなくなります。これは、デフォルトコンストラクタが定義されていない場合でも発生します。

+0

はい、私はC++のnewbです。私は上記の方法に固執すると思います。しかし、件名に関する追加情報をありがとう! – Leron

0

triコンストラクタがquadのデフォルトのコンストラクタを呼び出そうとしています。このコードを追加していない場合、コンパイラは基本クラスが正しく初期化されていることを確認します。

デフォルトのコンストラクタがないので、使用するベースのコンストラクタを明示的に呼び出す必要があります。

tri(int a, int b, int c) : quad(a,b){ 
     Lice = a*b*c; 
    } 

または何でもあなたがquadに渡す適切な引数です:あなたはこのようにそれをやります。

関連する問題