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

C++ 使用嵌套类而不是多重继承,C++;,c++,pointers,inheritance,multiple-inheritance,nested-class,C++,Pointers,Inheritance,Multiple Inheritance,Nested Class,我尝试使用嵌套类而不是多重继承。我正在遵循书中的建议,但我在构造函数中不断遇到错误。基本上,人是祖父,学生和员工是父母,助教是孩子。TeachingAsistant将有一个嵌套类,该类将引用其外部类,但当我使用本书中的代码时,会出现两个错误 我得到了错误 错误1*“没有用于初始化TeachingAsistant::EmployeePart的匹配构造函数” 这个错误呢 错误2“EmployeePart”的行外定义与“TeachingGassistant::EmployeePart”中的任何声明不匹

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

我得到了错误

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

这个错误呢

错误2“EmployeePart”的行外定义与“TeachingGassistant::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) {}
如果我提供构造函数,为什么会出现这些错误

EmployeePart(TeachingAssistant&);
您的构造函数需要引用,但您正在使用is指针传递

employee_ptr=新员工部分(此部分)传递*这个


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

您的基本问题是错误地调用了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
};
第四个变化在下一行:

TeachingAssistant::EmployeePart::EmployeePart(TeachingAssistant& taval)
: ta_part(taval) {}

(TeachingAssistant*taval)
与声明中的签名不同
员工艺术(TeachingAssistant&)
。您是否尝试定义默认构造函数
EmployeePart()
来修复错误1?如果使用默认构造函数,我仍然会收到错误,您必须传递引用而不是指针,因此,
new EmployeePart(*this)
或将原型更改为
EmployeePart(TeachingAsistant*)
第二个错误,是不是
EmployeePart
不是嵌套类:您没有在
TeachingAssistant
中声明或定义它。在内部定义/声明它或删除前缀
TeachingAssistant::
如果为
employee\u ptr
使用原始指针,则必须担心析构函数(释放内存)和复制构造函数(如果它们的析构函数都将释放它,则不希望指针指向同一块),同样,对于副本分配。如果您使用unique_ptr,析构函数和move构造函数/赋值“just work”和copy构造函数/赋值在您编写专门化之前不会编译。使用
ta_part
的指针问题较小,但考虑到您永远不希望更改拥有此employee_part的ta的地址,你永远不希望它为空,引用更符合语义。我撒谎了。移动构造函数/赋值将不起作用-它们将编译,但它们将是错误的。(ta_部分将是对源对象的死引用。)那么基本上唯一的_ptr处理内存管理和大3?auto_ptr与unique_ptr的工作原理相同吗?因此,如果我使用unique_ptr,构造函数和赋值将被编译,但不能正常工作?
TeachingAssistant::EmployeePart::EmployeePart(TeachingAssistant& taval)
: ta_part(taval) {}