C++ 我应该如何编写副本构造函数来初始化另一个对象?
比方说,作为一个简化的例子,我有一个类对象房子,它也有一个对象厨房 以下是头文件:C++ 我应该如何编写副本构造函数来初始化另一个对象?,c++,oop,destructor,C++,Oop,Destructor,比方说,作为一个简化的例子,我有一个类对象房子,它也有一个对象厨房 以下是头文件: class Kitchen { private: int width; int height; int length; public: Kitchen(int width, height, length); // default constructor }; class House { private: int houseI
class Kitchen {
private:
int width;
int height;
int length;
public:
Kitchen(int width, height, length); // default constructor
};
class House {
private:
int houseId;
Kitchen newKitchen;
public:
House(Kitchen newKitchen, int houseId); // default constructor
House& operator=(House const& other); // copy assignment
House(House const& other); // copy constructor
~House(); // destructor
};
复制houseId
在复制分配功能中工作正常。但是我在引用House::House(House const&other){*this=other;}
时出错如下:
error: constructor for 'House' must explicitly initialize the member 'newKitchen' which does not have a default constructor
我不确定,因为我认为我的默认构造函数声明涵盖了这一点。首先,您在厨房中的“默认构造函数”不是默认构造函数,而是用户定义的构造函数。它应该初始化成员,并且我还将在之后重新启用复制和移动行为
然后,您的房屋
可以以类似的方式使用此用户定义的构造函数
House(Kitchen _newKitchen, int _houseId) : houseId(_houseId), newKitchen(_newKitchen) {}
请注意,您的厨房
可以只是一个POD聚合类型,以避免麻烦
class Kitchen
{
public:
int width;
int height;
int length;
}
这将遵循“零规则”,并且将是默认可构造、聚合可初始化、可复制和可移动的。你的House
类也是如此。首先,你在Kitchen
中的“默认构造函数”不是默认构造函数,而是用户定义的构造函数。它应该初始化成员,并且我还将在之后重新启用复制和移动行为
然后,您的房屋
可以以类似的方式使用此用户定义的构造函数
House(Kitchen _newKitchen, int _houseId) : houseId(_houseId), newKitchen(_newKitchen) {}
请注意,您的厨房
可以只是一个POD聚合类型,以避免麻烦
class Kitchen
{
public:
int width;
int height;
int length;
}
这将遵循“零规则”,并且将是默认可构造、聚合可初始化、可复制和可移动的。你的House
类也是如此。如果类成员中的所有内容都是可复制的,那么最好的选择就是根本不编写复制构造函数。默认情况下,编译器会生成一个。。。。和厨房(内部宽度、高度、长度)代码>和房屋(厨房、新厨房、内部房屋ID)代码>不是默认构造函数。旁注:让赋值运算符使用复制构造函数通常比使用其他方法更容易。当您有需要初始化的成员或基类时,赋值不能剪切它。如果类成员中的所有内容都是可复制的,那么最好的选择是根本不编写复制构造函数。默认情况下,编译器会生成一个。。。。和厨房(内部宽度、高度、长度)代码>和房屋(厨房、新厨房、内部房屋ID)代码>不是默认构造函数。旁注:让赋值运算符使用复制构造函数通常比使用其他方法更容易。当您有需要初始化的成员或基类时,赋值不能剪切。您好,非常感谢您的评论。我已经试着实现你的建议,但仍然会遇到同样的错误。我已经在我的用户定义文件中为房屋和厨房创建了一个初始化列表constructors@mlan如果您已经实现了Cory的建议,那么就不会出现相同的错误。您好,非常感谢您的评论。我已经试着实现你的建议,但仍然会遇到同样的错误。我已经在我的用户定义文件中为房屋和厨房创建了一个初始化列表constructors@mlan如果您已经实现了Cory的建议,那么就不会出现相同的错误。