1

私は得る

エラー: 'Base::Base()' の呼び出しに一致する関数がありません

コードで

class Base {
private:
     char *field;
public:
    Base(char *c){
        field = c;
    }
};

class Derived : public Base {
public:
    Derived(char *c){}
};

追加するとすぐにエラーが消えます

Base() {}

コンストラクタ。Base()C++ コンパイラが引数なしのコンストラクタを厳密に要求するのはなぜですか? Base引数なしでオブジェクトを作成しても意味がない場合はどうすればよいでしょうか?

PSたとえば、追加する必要があるため、同様のJavaコードで同じエラーは発生しません

super("")

Derivedコンストラクタ本体の最初のステートメントとして。そして、それは本当に合理的です。

4

7 に答える 7

5

C++コンパイラが引数なしでBase()コンストラクタを強く要求するのはなぜですか?

Derived(char*)を呼び出そうとするためBase()、他のコンストラクターを呼び出すように指示していないため、次のように実行できます。

 Derived(char *c) : Base('x') {}

または、コンストラクター引数が指す を使用しcharDerivednull ポインターを逆参照しないようにします。

 Derived(char *c) : Base( c ? *c : 'x') {}
于 2013-05-10T16:44:03.443 に答える
5

C++ は基本クラスにデフォルトのコンストラクターを必要としませんが、Java と同様に、Super と同等のものを呼び出す必要があります。そうしないと、コンパイラーはデフォルトのコンストラクターを呼び出そうとします (それがないため、エラーが発生します)。 :

Derived(char *c) : Base(*c) { }

の後のビットはinitializer-list:と呼ばれ、最も便利です。そこで基本クラスのコンストラクターを呼び出すことができるだけでなく、デフォルト以外のコンストラクターを持つメンバー変数 (構文) を初期化することもできます。: var(val), var2(val2)

于 2013-05-10T16:44:52.860 に答える
3

ベース初期化子を指定する必要があります。

Derived(char * c)  :  Base('x') { }
于 2013-05-10T16:44:14.163 に答える
2

これは

Derived(char *c){}

暗黙的に呼び出す

Base()

明示的に呼び出すコンストラクターを指定しない限り、次と同等です

Derived(char *c) : Base() {}
                   ^^^^^^

AndBase::Base()は、独自のコンストラクターを実装しているため使用できません。それ以外の場合は、デフォルトで有効になっています。明示的に指定すると、コードは準拠します。しかし、おそらくあなたが望むことをしていません

于 2013-05-10T16:44:01.473 に答える
1

C++コンパイラが引数なしでBase()コンストラクタを強く要求するのはなぜですか?

そうではありません。コンストラクターの 1 つを使用するには、派生クラスが必要です。引数を指定しない場合は、デフォルトのコンストラクターを使用しようとします。

引数なしで Base オブジェクトを作成しても意味がない場合はどうすればよいでしょうか?

次に、派生クラスは、使用するコンストラクターに引数を提供する必要があります。

Derived(char *c) : Base(c) {}
于 2013-05-10T16:48:26.823 に答える
1

あなたのクラスBaseには、引数を取らないコンストラクターがありません。それを行うものを作成するか、既存のものに初期化子を追加することができます:

 Derived(char *c) : Base('a') { ... } 
于 2013-05-10T16:44:29.340 に答える
1

Base のコンストラクターを明示的に作成するとすぐに、コンパイラーは base のデフォルト ctor を生成しなくなります。それが、そのエラー メッセージが表示される理由です。例えば

class Base{}; //here compiler auto-generates 'Base(){}' for you

class Base2{ 
 Base2(char c){}
}; //here compiler does NOT auto-generate `Base2(){}` for you. 
   //Hence that constructor does not exist and you have to create it yourself
于 2013-05-10T16:44:38.087 に答える