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