在 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++ 中为具有包含指针的集合的类编写复制构造函数的主要内容,如果未能解决你的问题,请参考以下文章