2012-01-16 10 views
-1

スーパークラスのコンストラクタが引数を受け取ると、それはもはやデフォルトコンストラクタではありません。私はサブクラスを作るしようとすると、例えばC++、デフォルトのコンストラクタ

class a { 
    public: 
     int a; 
     int b; 
     a(int c, int d){ 
     cout<<"hello"; 
     }; 
} 

今、プログラムでエラーが発生し、それが「デフォルトのコンストラクタがスーパークラスで定義されていない」と言います。どうすればこの問題を解決できますか?私が議論を取り除くと、すべてがうまくいくだろうが、私のC++テストではそうしないと言われている。私はそれを把握するのを助けてください。

+0

これが関連している:http://stackoverflow.com/questions/5577663/about-base-class-in-derived-class初期化 –

答えて

2

あなたは通常、初期化子リストでこれに対処:

#include <iostream> 

class a { 
public: 
    a(int c, int d) { std::cout << c << " " << d << "\n"; } 
}; 

class b : public a { 
public: 
    b() : a(1, 2) {} 
}; 

int main() { 
    b x; 
    return 0; 
} 
+0

コードを変更することはできません。そのスーパークラスのいくつかの追加サブクラスを追加するだけです。 –

+0

これには、基本クラスの変更、派生クラスの変更のみが含まれます。私は完全性のためだけに上記の基本クラス定義を含んでいますが、ここで与えられた 'b'はあなたの質問で定義した' a'で動作するはずです。 –

+0

私はそれを試しましたが、ビジュアルスタジオは線b()全体に下線を引いています:a(1,2){}、 –

2

自分で引数を取らないコンストラクタを指定する必要があります。

クラスにコンストラクタを指定すると、コンパイラは引数をとらない暗黙のデフォルトコンストラクタを生成しません。したがって、コードに引数なしのコンストラクタが必要な場合は、それを自分で提供する必要があります。

+0

私はちょうど試みたが、それは私に同じエラー+ aの新しいものを与えた:: a(){}。何か案が? –

+0

あなたのコードを質問に投稿してください。あなたが何を手助けできるか試したことを示しているかどうか分かりませんか? –

+0

私はコードを与えられましたが、私はそれを変更することはできません。私がしなければならないのは、与えられたスーパークラスに基づいて2つのサブクラスを追加することです。クラスは次のようなものです:class a { public: \t int x; \t文字列h; \t (int y、string d){ \t \t y = 10; \t d = "hello"; \t cout << y << endl << d; \t}; }; –

3

を、その後、あなたのベースクラスは、構成可能デフォルトではない場合、またはあなたがは、基本クラスのデフォルトコンストラクタを使用しない場合あなたは、単ににベースサブオブジェクトを構築する方法をに派生クラスを教えています

struct b : a 
{ 
    b(int n) : a(n, 2*n) { } 
    //   ^^^^^^^^^ <-- base class initializer, calls desired constructor 
}; 
関連する問題