Я просто должен привыкнуть к базовым конструкторам копирования.
Я предположил, что правильно разместил конструкторы копирования.
Но когда я пытаюсь скомпилировать, я получаю сообщение об ошибке «Нет подходящего конструктора для инициализации 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;
}
Объявив B(int)
а также B(const B &)
, вы отключили конструктор по умолчанию, который неявно помещается в класс для вас, когда у вас нет других конструкторов, потому что для всего, что знает компилятор, вы можете не захотеть конструктор по умолчанию, поэтому он не может делать предположения (посмотреть здесь).
Добавьте следующее к B
, не забывая инициализировать базу и членов с ней:
B(){}
В C ++ 11 это работает хорошо:
B() = default;
Что позволит B
иметь конструктор по умолчанию для использования при объявлении B b1;
То же самое относится и к A
, тоже. У вас есть конструктор копирования, так что больше нет конструктора по умолчанию, неявно размещенного для вас.
Других решений пока нет …