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 回答