使用嵌套类而不是多重继承,C++

Using Nested Classes Instead of Multiple Inheritance, C++

本文关键字:多重继承 C++ 嵌套      更新时间:2023-10-16

我正在尝试使用嵌套类而不是多重继承。我遵循了书中的建议,但我在构造函数中不断出错。基本上,人是祖父,学生和员工是父母,助教是孩子。TeachingAssistant将有一个嵌套类,它将引用它的外部类,但当我使用书中的代码时,我会得到两个错误

我得到错误

错误1*"没有用于初始化TeachingAssistant的匹配构造函数:EmployeePart"

这个错误

错误2"'EmployeePart'的越界定义与'TeachingAssistant::EmployeyPart'中的任何声明都不匹配"

这是代码:

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) {}

如果我提供构造函数,为什么会弹出这些错误?

您的基本问题是您错误地调用了EmployeePart构造函数,并错误地定义了它。然而,在我们解决这一问题的同时,我们还将解决这样一个事实,即您应该不使用new,不使用拥有内存的原始指针,并且在不需要可为Null性或可重新密封性时不使用指针。

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&);

您的构造函数想要引用,但您传递的是带有is指针的thisemployee_ptr = new EmployeePart(this);通过*而不是

第二个错误。您的声明与定义不同。参见TeachingAssistant* tavalEmployeePart(TeachingAssistant&);