-3

エラー C2512 が表示されます: '派生' : 派生クラスの両方のコンストラクター定義で、適切なデフォルト コンストラクターがありませんというエラー表示されます。私のコードは次のようなものです。この問題を解決するにはどうすればよいですか?

Class A
{
    int a, int b;
    A(int x, int y)
    {
        sme code....
    }
}

Class B
{
    int a, int b, int c;
    B(int x, int y, int Z)
    {
        sme code....
    }
}


Class derived : public A, public B
{
    derived(int a, int b):A(a, b)
    {

    }

    derived(int a, int b, int c):B(a, b, c)
    {

    }
}
4

3 に答える 3

5

問題の 1 つは、各派生クラスのコンストラクターで、適切なコンストラクター引数を 2 つの基本クラスの 1 つだけに転送していることです。それらのいずれにもデフォルトのコンストラクターがないため、基本クラスAB.

2 番目の問題は、基本クラスのコンストラクターが暗黙的に として宣言されてprivateいるため、基本クラスがそれらにアクセスできないことです。publicまたは少なくとも のいずれかにする必要がありますprotected

マイナーな問題: クラス定義の後にセミコロンを付ける必要があります。また、クラスを宣言するためのキーワードはclass, notClassです。

class A // <---- Use the "class" keyword
{
public: // <---- Make the constructor accessible to derived classes
     int a, int b; 
     A(int x, int y) 
     { 
         some code.... 
     } 
}; // <---- Don't forget the semicolon

class B // <---- Use the "class" keyword
{
public: // <---- Make the constructor accessible to derived classes
    int a, int b, int c;
    B(int x, int y, int Z)
    {
        sme code....
    }
}; // <---- Don't forget the semicolon


// Use the "class" keyword
class derived : public A, public B
{
    derived(int a, int b) : A(a, b), B(a, b, 0) // <---- for instance
    {

    }

    derived(int a, int b, int c) : B(a, b, c), A(a, b) // <---- for instance
    {

    }
};  // <---- Don't forget the semicolon
于 2013-02-08T11:59:29.113 に答える
1

クラス A と B の両方にデフォルトのコンストラクターがありません。派生コンストラクターで A と B のコンストラクターを明示的に初期化する必要があります。各派生コンストラクターで A または B コンストラクターの初期化に失敗しました:

derived(int a, int b):A(a, b), B(a, b, 0) 
                               ^^^
{
}

derived(int a, int b, int c):A(a, b), B(a, b, c)
                             ^^^
{
}
于 2013-02-08T11:59:17.933 に答える
0

最初の派生 ctor は A の ctor を呼び出しますが、B の ctor は呼び出しません。そのため、コンパイラは、存在しない B の既定のコンストラクターを呼び出そうとします。

2 番目の派生 ctor についても同じですが、A と B を入れ替えます。

解決策: A と B のデフォルトの ctor を指定します。

于 2013-02-08T12:00:03.307 に答える