2

基本的なコピー コンストラクターに慣れてきたはずです。

コピーコンストラクターを適切に配置したと思いました。

しかし、コンパイルしようとすると、「B の初期化に一致するコンストラクターがありません」というエラーが表示され続けます。

私は少し混乱しています。

class A {
    int valuea;

public:     
    A(const A&); // copy constructor
    int getValuea() const { return valuea; }
    void setValuea(int x) { valuea = x; }
};

class B : public A {
    int valueb;
public:
    B(int valueb);
    B(const B&); // copy constructor
    int getValueb() const { return valueb; }
    void setValueb(int x) { valueb = x; }
};

int main () {
    B b1;
    b1.setValuea(5);
    b1.setValueb(10);
    B b2(b1);
    cout << "b2.valuea="  << b2.getValuea() << "b2.valueb="  << b2.getValueb() << endl;

    return 0;
}
4

1 に答える 1

4

B(int)andを宣言することによりB(const B &)、他のコンストラクターがない場合に暗黙的にクラスに配置されるデフォルトのコンストラクターを無効にしました。これは、コンパイラーが知っているすべての場合、デフォルトのコンストラクターが必要ないため、仮定を行うことができないためです (こちらを参照)。 )。

Bベースとメンバーを初期化することを忘れずに、次を に追加します。

B(){}

C++11 では、これはうまく機能します。

B() = default;

これによりB、宣言時に使用するデフォルトのコンストラクターを持つことができますB b1;

についても同様ですA。コピー コンストラクターがあるため、既定のコンストラクターが暗黙的に配置されることはなくなりました。

于 2012-10-17T00:33:16.873 に答える