我有三个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
的复制构造函数中。
如何解决这个问题?
我的想法:
实例化所有对象并迭代A的copy-constructor中的完整结构,并将重复对象的智能指针重定向到同一个(效率低下)。
使用某种工厂决定是否创建一个新对象(我的结构中的元素具有唯一的ID,因此很容易),或者传递给现有的一个smart_ptr。 (我不知道如何告诉工厂何时清除它的内容,因此工厂不再拥有这些物品并且可以制作多份副本)