我应该习惯于习惯基本的复制构造函数。
我认为我正确放置了复制构造函数。
但是当我尝试编译时,我不断收到错误“没有用于初始化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;
}
答案 0 :(得分:4)
通过声明B(int)
和B(const B &)
,您已经禁用了在没有其他构造函数时隐式放置在类中的默认构造函数,因为对于所有编译器都知道,您可能不需要默认构造函数,因此无法进行假设(see here)。
将以下内容添加到B
,记住要用它来初始化基础和成员:
B(){}
在C ++ 11中,这很有效:
B() = default;
这将允许B
拥有默认构造函数,以便在声明B b1;
时使用
A
同样如此。你有一个拷贝构造函数,因此不再为你默认隐藏任何默认构造函数。