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的建议,那么就不会出现相同的错误。