【问题标题】:Do I have to write explicitly a copy constructor to copy a vector of objects into another我是否必须显式编写复制构造函数才能将对象向量复制到另一个
【发布时间】:2018-02-27 16:35:18
【问题描述】:

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

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) {};
};

【问题讨论】:

  • 我认为您错误地使用了术语“复制构造函数”。您的选择是分配向量或 for 循环。第二个选项与复制构造函数无关。如果您不同意,请澄清您的问题。
  • 不,如果你没有明确定义除构造函数之外的任何其他内容,你可能没有。
  • 展示你的班级。
  • @anatolyg 你是对的,它不是 UserDefinedClass 的复制构造函数,而是类 Vector 的复制构造函数。 Vector类只能处理int、double等内置对象吗?

标签: c++


【解决方案1】:

您的UserDefinedClass 有一个引用成员变量。引用成员构造后不能被反弹,所以类默认是不可复制赋值的,也就是说它们的一个向量也不能复制赋值。

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

【讨论】:

  • 是gcc编译器产生这个错误的原因,是因为带有引用变量的类的复制构造函数被自动删除了吗?
【解决方案2】:

必须初始化一个引用。当你这样做时,你试图在创建后分配给引用。

可行的是从另一个向量构造一个副本。

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 我需要向量,原始的和复制的。
    • 在这种情况下,您要么需要实现复制构造函数(或删除阻止编译器生成的任何内容)或存储指针
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2021-03-12
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    相关资源
    最近更新 更多