Использование вложенных классов вместо множественного наследования, C++
Я пытаюсь использовать вложенные классы вместо множественного наследования. Я следую рекомендациям из книги, но получаю сообщение об ошибке в конструкторе. В сущности, Персона - это дедушка, Студент и Сотрудник - это Родитель, а Учитель - это ребенок. У TeachingAssistant будет вложенный класс, который будет иметь ссылку на его внешний класс, но когда я использую код из книги, я получаю две ошибки
Я получаю ошибку
Ошибка 1 *"Нет подходящего конструктора для инициализации TeachingAssistant::EmployeePart"
и эта ошибка
Ошибка 2 "Внешнее определение" EmployeePart "не соответствует ни одному объявлению в" TeachingAssistant:: EmployeePart ""
Вот код:
class TeachingAssistant : public Student
{
public:
TeachingAssistant();
private:
class EmployeePart;
EmployeePart* employee_ptr;
};
class TeachingAssistant::EmployeePart : public Employee
{
public:
EmployeePart(TeachingAssistant&);
private:
TeachingAssistant* ta_part; // Allows access back to outer class
};
Ошибка 1 здесь в этом конструкторе
TeachingAssistant::TeachingAssistant()
{
employee_ptr = new EmployeePart(this); // Pass pointer to implicit parameter
}
Ошибка 2 здесь
TeachingAssistant::EmployeePart::EmployeePart(TeachingAssistant* taval)
: ta_part(taval) {}
Почему эти ошибки появляются, если я предоставляю конструкторы?
2 ответа
Ваша основная проблема в том, что вы неправильно вызвали конструктор EmployeePart и неправильно его определили. Однако, пока мы это исправляем, мы также учтем тот факт, что вы предпочитаете не использовать new
и не использовать необработанные указатели, которые владеют памятью, и не использовать указатели, когда вам не нужны обнуляемость или возможность повторного использования.
class TeachingAssistant : public Student
{
public:
TeachingAssistant();
TeachingAssistant(const TeachingAssistant&rhs) = delete; // Delete copy constructor.
TeachingAssistant& operator=(const TeachingAssistant&rhs) = delete; // And assignment.
private:
class EmployeePart;
std::unique_ptr<EmployeePart> employee_ptr; // First change here.
};
class TeachingAssistant::EmployeePart : public Employee
{
public:
EmployeePart(TeachingAssistant&);
private:
// Second change here. Store reference, not pointer.
TeachingAssistant& ta_part; // Allows access back to outer class
};
Создать employee_ptr
в списке инициализации и передать *this
не this
,
TeachingAssistant::TeachingAssistant()
: employee_ptr(std::make_unique<EmployeePart>(*this)) // Pass reference to constructor
{
}
Четвертое изменение на следующей строке:
TeachingAssistant::EmployeePart::EmployeePart(TeachingAssistant& taval)
: ta_part(taval) {}
EmployeePart(TeachingAssistant&);
Ваш конструктор хочет ссылку, но вы передаете this
с указателемemployee_ptr = new EmployeePart(this);
передать * это вместо
Вторая ошибка Ваша декларация отличается от определения. Увидеть TeachingAssistant* taval
а также EmployeePart(TeachingAssistant&);