我是否必须明确编写复制构造函数以将对象向量复制到另一个对象中

时间:2018-02-27 16:35:19

标签: c++

我有一个用户定义对象的向量,例如

std::vector<UserDefinedClass> list_of_objects;

UserDefinedClass没有任何显式的复制构造函数。

现在我想复制一下。所以,我定义了

std::vector<UserDefinedClass> list_of_objects_copied;
list_of_objects_copied = list_of_objects;

我是否真的需要一个复制构造函数来迭代矢量并逐个复制矢量中的对象?

错误是

error: use of deleted function ‘UserDefinedClass& UserDefinedClass::operator=(const UserDefinedClass&)’

如果我使用内置对象,如int,double等,我在复制列表时没有任何问题。

班级定义

UserDefinedClass {
private:
    int &m_a;
public:
    UserDefinedClass(int a):m_a(a) {};
};

3 个答案:

答案 0 :(得分:4)

您的UserDefinedClass有一个参考成员变量。构造后参考成员不能反弹,因此默认情况下该类不可复制,这意味着它们的向量也不能被复制分配。

您可以复制构造以创建项目的新副本,或者根据您的需要,您可以创建自己的副本分配运算符,该运算符执行与引用成员不同的操作。

答案 1 :(得分:0)

是,如果要通过将对象复制到另一个向量来复制对象,则需要复制构造函数。如果要避免复制,可以将第一个向量移动到第二个向量中,这会使第一个向量无效,或者在向量中存储指针(理想情况下为shared_ptr),然后可以复制而不复制基础对象。

要使类可复制,请将引用成员更改为指针:

UserDefinedClass {
private:
    int *m_a;
public:
    UserDefinedClass(int& a):m_a(&a) {};
};

您仍然可以将传递给构造函数的参数保留为引用,以保证该值不为null。

答案 2 :(得分:0)

必须初始化参考。执行此操作时,您将尝试在创建参考后分配该参考。

从另一个向量构建副本将起作用。

std::vector<UserDefinedClass> list_of_objects = { ... };
std::vector<UserDefinedClass> list_of_objects_copied{list_of_objects};