如果涉及共享指针,如何制作深层副本?

时间:2015-08-18 12:49:01

标签: c++ qt copy copy-constructor

我有三个A,B和C类的结构,它们可以互相拥有。可以有两个对象拥有相同对象的所有权。不存在循环依赖。您可以将结构视为非循环图,其中A是唯一的根。 我想复制整个结构,它需要是一个深层复制。我正在使用复制交换习语,它就像一个魅力,除非面临多个所有权:

shared_ptr<A> a { new A {} };
shared_ptr<B> b { new B {} };
shared_ptr<C> c { new C {} };
//Add only stores a copy of the shared pointer
a.add(b);
a.add(c);
b.add(c);
//This will produce two copies of c
shared_ptr<A> newA { new A {a} };

最后一行实际上会创建c的两个独立副本,一个位于a的复制构造函数中,另一个位于b的复制构造函数中。

如何解决这个问题?

我的想法:

  1. 实例化所有对象并迭代A的copy-constructor中的完整结构,并将重复对象的智能指针重定向到同一个(效率低下)。

  2. 使用某种工厂决定是否创建一个新对象(我的结构中的元素具有唯一的ID,因此很容易),或者传递给现有的一个smart_ptr。 (我不知道如何告诉工厂何时清除它的内容,因此工厂不再拥有这些物品并且可以制作多份副本)

0 个答案:

没有答案