我有以下情况:
我需要从类型A
创建变量的深(!)副本。此变量包含B
类型的向量。类B
不可复制,因为它包含std::unordered_map
,其值为unique_ptr
(不可复制)。我想避免通过复制构造函数或复制赋值运算符复制B
。
一个问题是unique_ptr
的类型只是基本类型。实际对象派生自C
并包含不同的成员并具有不同的构造函数。
class A{
public:
A(const A&); // how should I implement this?
A& operator=(const A&); // how should I implement this?
private:
vector<B> vectorOfB;
}
class B{
private:
std::unordered_map<std::string, std::unique_ptr<C> mapOfDerivedTypesOfC;
}
class C{}
class C_1: public C{
public:
C_1(double x)
}
class C_2: public C{
public:
C_2(double y, double z)
}
背景: A类的目的是读取大量带有数据的大型文本文件并创建许多对象。 之后我必须用这个对象运行monte-carlo模拟。对于每个模拟,我需要A的新副本。 我不想每次都阅读所有文本文件,因为它很耗时。因此,有必要制作A的深层副本。在一次模拟中,我想避免复制B,因为它不会复制此对象。我认为使用sharded_ptr无济于事,因为我需要一个深层复制,并且模拟使用openMP并行运行。
编辑: 我认为整体问题是我应该如何复制unordered_map
答案 0 :(得分:2)
我认为这种技术被称为“虚拟拷贝构造函数”:
// in baseclass
public:
unique_ptr<Base> clone() const
{
unique_ptr<Base> other(this->do_clone());
assert(typeid(*this) == typeid(*other));
return other;
}
private:
virtual Base* do_clone() const = 0;
// in derived class
private:
virtual Derived* do_clone() const
{
return new Derived(*this);
}
这个想法是一个类型最终有信息如何克隆自己的实例,所以你通过虚函数委托克隆它。断言确保派生类正确实现/覆盖基类实现。
答案 1 :(得分:1)
长话短说,您需要在C
中为每个继承类编写一个虚函数来覆盖。像
virtual std::unique_ptr<C> anotherOnePlease() = 0;
然后您可以在每个C *
上使用此功能,并创建一个新地图。有点糟糕,但如果你为每个派生的C
实现这个功能,至少可以写一个简单的复制地图的功能。