2016-10-29 35 views
1

考虑Container类,它基本上存储了unique_ptr的矢量对象,并且可以对它们执行一些计算。具有抽象类指针的对象的C++副本

class Container 
{ 
    private: 
    std::vector<std::unique_ptr<Box> > boxes_; 
    public: 
    Container(std::vector<std::unique_ptr<Box> > &&boxes): boxes_(std::move(boxes)){} 
    double TotalVolume() { /* Iterate over this->boxes_ and sum */ } 
}; 

这里,Box是具有诸如double Box::Volume()纯虚拟方法的抽象类。

现在,假设我实例化一个容器在主程序为:

std::vector<std::unique_ptr<Box> > x; 
x.push_back(std::move(std::unique_ptr<Box>(new SquareBox(1.0))); 
x.push_back(std::move(std::unique_ptr<Box>(new RectangularBox(1.0, 2.0, 3.0))); 
Container c(x); 

如何使c副本?我想要一个功能,使底层Box对象的副本boxes_,但我认为这很难做到这一点与基类?

+0

无论如何,你为什么不使用std :: vector ? – Danh

+0

谢谢:C'tor变了。至于不使用'vector ','Container',实际上是一个具有虚拟'TotalVolume'方法的基类的派生类。我原来的问题不是盒子和容器,而是一些我试图扩展的复杂项目。 – Salmonstrikes

回答

2

使您的副本的一种方法是在您的基类中有一个“复制”虚拟方法。此方法将创建当前对象的副本并返回一个(唯一)指针。如果该类中包含任何包含的指针,则它们还需要创建新副本(深层副本)。

存在其他方法。例如,您可以测试向量中的每个对象以确定其类型(使用dynamic_cast),但这很丑,效率低,且容易出错。

+0

这实际上对我的情况非常好。有没有这个设计模式的名称(带'unique_ptr'的复制方法)? – Salmonstrikes

+1

@Salmonstrikes:通用名称是**克隆**功能。其中一位老专家把它称为**虚拟构造函数**,但该术语在ISO C++常见问题解答中(或者至少在原始的C++ FAQ中),但它很少使用。甚至还有一些调查问卷旨在测试你的C++知识,并询问为什么在C++中不可能存在虚拟构造函数,从而暴露作者缺乏知识(一度是阅读良好的人使用的术语)和作者缺乏推理能力(当你设计一门语言时几乎任何东西都可以赋予意义)。 –