【问题标题】:Why would you want a shallow copy (instead of a reference)?为什么要浅拷贝(而不是引用)?
【发布时间】:2015-09-01 12:05:38
【问题描述】:

一直在使用 boost 的disjoint_set。它有一个复制构造函数。据我了解,它使用在构造函数调用期间传递的指针来访问它的数据,并且它自己不管理内存分配。因此,当您进行复制时,不会复制实际数据(与复制std::vector<T> 时不同)。您会得到两个看似独立的实例(因为您没有使用引用),它们访问和修改相同的数据。这看起来很随意,用例也不清楚。

那么问题来了,为什么你会说disjoint_set的拷贝构造函数很有用,你为什么要创建一个返回实例的浅拷贝的拷贝构造函数呢?

【问题讨论】:

  • 您想要关于disjoint_set 的答案,还是一般的答案?
  • @SingerOfTheFall 是两个密切相关的东西?

标签: c++ copy-constructor


【解决方案1】:

你的意思是这个:inline disjoint_sets(const self& c) : rank(c.rank), parent(c.parent) {}?这里不清楚它是浅拷贝还是深拷贝。 rank 和 parent 是模板类型:class RankPA,class ParentPA,所以由这个模板的客户端决定是浅拷贝还是深拷贝。

为什么要创建一个返回实例的浅拷贝的拷贝构造函数?

当您动态分配内存时它很危险,您可以考虑使用移动语义。

【讨论】:

  • inline disjoint_sets(const self& c) : rank(c.rank), parent(c.parent) {} 不是浅拷贝的定义,因为它依赖于有自己的拷贝构造函数的类型吗?
  • 您将如何使用它来启用深度复制?通常我们会按照answer to this question 中的建议使用它。 boost::disjoint_sets<int*,int*> ds(rank.data(), parent.data()); // rank and parent are std::vector<int>
  • @zehelvion 如果您必须使用 int* 作为此类的模板类型,那么它肯定是浅拷贝,但也许您可以编写一个充当 int* 并允许深拷贝的包装器类型.我想 disjoint_sets 的作者将其留给用户以确保安全使用此构造函数。
  • @NathanOliver 我想在实例化之前你无法判断这个构造函数是浅拷贝还是深拷贝
  • 是的,我想,考虑到运算符重载。所以...基本上由你来做一些表现得像指针但做深拷贝的东西。
猜你喜欢
  • 2011-03-22
  • 2018-02-26
  • 2016-09-27
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多