【问题标题】:Copy constructor for a class with unique_ptr to an abstract class as a member将具有 unique_ptr 的类的构造函数作为成员复制到抽象类
【发布时间】:2015-08-18 08:31:40
【问题描述】:

我有一个类 (C) 与一个抽象类 (A) 的 unique_ptrs 的 vector 作为成员。这是因为C 必须与A 类型的所有类一起使用,即它的子类。

问题是我无法弄清楚如何为C 编写一个复制构造函数,因为在编译时指针所指向的对象的类型是未知的。在我看来,这实际上是不可能的。谁能确认这是不可能的?您对如何解决问题有什么建议吗?没有复制构造函数的类是不是太糟糕了?

【问题讨论】:

  • 没有复制构造函数的类是不是太糟糕了? 不,没关系。例如,unique_ptr 没有您可能已经注意到的。
  • 一种解决方案是将成员函数virtual A* clone() = 0; 添加到A
  • Do what Pubby said,但前提是您需要 C 可复制构造。拥有不可复制的类并没有错,这完全取决于您的用例。
  • 你认为这个副本会做什么?如果您还打算复制unique_ptrs 指向的所有对象,那么唯一的方法是A 必须包含一个克隆函数。

标签: c++ class c++11 copy-constructor


【解决方案1】:

好吧,由于std::unique_ptr<T> 不可复制,因此std::vector<std::unique_ptr<T>> 不可复制,因此C 具有std::vector<std::unique_ptr<T>> 作为成员不应该是默认可复制的。

当然,您可以实现对T 进行深层复制的复制构造函数,但这取决于T 的实际含义。

【讨论】:

【解决方案2】:

你没有说你是否可以控制抽象类和派生类的代码。如果这样做,那么最简单的方法是在抽象类中提供一个纯虚方法Clone,并在派生类中实现它。此方法应处理创建正确的副本。不幸的是,由于 unique_ptr 不可复制,您需要遍历您的向量并通过调用 Clone 创建副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 2020-03-01
    • 1970-01-01
    • 2011-07-21
    • 2018-06-10
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多