Использование вложенных классов вместо множественного наследования, 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&);

Другие вопросы по тегам