在 C++ 中为具有包含指针的集合的类编写复制构造函数

Posted

技术标签:

【中文标题】在 C++ 中为具有包含指针的集合的类编写复制构造函数【英文标题】:Writing a copy constructor for a class in C++ that has a set containing pointers 【发布时间】:2020-08-01 16:54:34 【问题描述】:

假设你有一个 C++ 类,如下所示:

template<typename T>
class my_class 
public:
private:
  std::set<T*> class_set;
  int elements_in_set;

我正在尝试为这个类编写一个复制构造函数,到目前为止我被困在下面,我只知道如何复制整数elements_in_set,但我不确定如何复制在集合上,并对其他 class_set 的指针指向的内容进行深层复制:

my_class(my_class const& other)
: class_set, elements_in_setother.elements_in_set 
  //don't know how to copy over the set

我知道如果类有一个指针作为成员,你会使用new data type[size of data pointer points to],但是你必须调用new 来创建集合本身,然后为集合中的每个指针调用new ?任何帮助将不胜感激。如果有一种方法可以使用标准库算法而不是 for 循环来做到这一点,那就太好了。

【问题讨论】:

不,您不应该使用new 来制作新套装。是的,您必须使用new 来创建每个进入新集合的指针。在您可以使用for 循环之前,请勿尝试使用标准算法执行此操作。 【参考方案1】:

视情况而定。你想要浅拷贝还是深拷贝?

对于浅拷贝(my_class 的两个实例共享相同的 T 对象)只需以与 int 成员相同的方式复制集合。

对于深拷贝(新实例获取自己的 T 对象副本),您需要遍历原始集合,创建一个新 T 并将其插入新集合。如果它只是集合中的 T 个对象,则使用 new 将完成这项工作。如果 T 是基类,则必须添加克隆函数。

请注意,在集合中包含指针至少有点不寻常。如果您想要使用值而不是指针的第二种行为(深拷贝),则可以免费提供。

编辑:请注意,您的 int 成员是多余的。一个集合会跟踪它的大小。

【讨论】:

如果T 是一个基类,那么使用值而不是指针会给你object slicing。

以上是关于在 C++ 中为具有包含指针的集合的类编写复制构造函数的主要内容,如果未能解决你的问题,请参考以下文章

在具有智能指针的类上正确实现复制构造函数和等于运算符

如何为具有自引用指针的类实现复制构造函数/赋值运算符?

C++对象数组与对象指针

在 C++ 中编写复制构造函数和赋值运算符的清单

C++链表移动赋值和移动构造函数

C/C++编程笔记:用C++编写赋值运算符,一般什么情况下用?