C++中抽象类指针的对象副本

4
考虑 Container 类,它基本上存储了一个 Box 对象的 unique_ptr 向量,并且可以对它们执行一些计算。
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?我想要一个能够复制boxes_中底层Box对象的函数,但是我认为只使用基类很难实现这个功能。


反正,你为什么不使用std::vector<Box>呢? - Danh
感谢您的关注:C'tor已被更改。至于不使用vector<Box>Container实际上是某个基类的派生类,该基类具有虚拟的TotalVolume方法。我的原始问题并不是关于箱子和容器的,而是涉及到一个我正在尝试扩展的复杂项目。 - Salmonstrikes
1个回答

5

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

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


这对我的情况非常有效。这种设计模式(使用unique_ptr的复制方法)有一个名称吗? - Salmonstrikes
1
@Salmonstrikes:常用的名称是 克隆 函数。其中一位老前辈称其为 虚构造函数,但是虽然这个术语在 ISO C++ FAQ 中出现过(或者至少在原始的 C++ FAQ 中出现过),但它很少被使用。甚至有些设计用来测试你的 C++ 知识的问卷调查会问为什么 C++ 中不能有虚构造函数,从而暴露了作者们的知识缺乏(曾经是有些有见识的人使用的术语)和作者们的推理能力不足(几乎任何东西都可以在设计语言时赋予意义)。 - Cheers and hth. - Alf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接