【问题标题】:C++ unique_ptr array of polymorphic type多态类型的 C++ unique_ptr 数组
【发布时间】:2020-09-15 12:25:23
【问题描述】:

我有以下问题。我有一个基类 A 的数组的 unique_ptr。在纯 C++ 中,用指向派生类型 B 的数组的指针初始化是没有问题的。现在使用 unique_ptr 我无法让它工作。我没有看到问题,并希望避免使用自定义删除器路线。我的方法还有其他问题吗?

struct A {
    virtual ~A() {};
};

struct B : public A {
    int min, max;
};

unique_ptr<A[]> a_arr;

// fails
a_arr.reset(new B[2048]);
a_arr = make_unique<B[]>(2048);

// works
A* a_raw_arr = new B[2048];

【问题讨论】:

  • 你的最后一行可以编译,但它不像你想要的那样工作。无法编译的 uniqueptr 行是一件好事。
  • 你为什么用unique_ptr&lt;A[]&gt; a_arr;而不是std::vector&lt;A&gt; a_arr;? (或者为了这个问题,std::vector&lt;A*&gt; a_arr;std::vector&lt;std::unique_ptr&lt;A&gt;&gt; a_arr;
  • "用指向派生类型B的数组的指针初始化是没有问题的"——我相信这实际上是个问题。
  • 好的,我知道我哪里出错了。谢谢!

标签: c++ c++11


【解决方案1】:

您不能将派生类型的元素存储在基本磁带的数组中,因为它们不适合。你可以做的是有一个指针数组。

【讨论】:

  • 在 OP 的情况下没有 基本类型的数组。只有一个指向数组的指针。我最好写一些无法通过指向基础对象数组的指针来处理派生对象数组
  • @DanielLangr unique_ptr 以A[] 为模板。我没有看到它的所有更好的影响,但它肯定会做一些阵列式的事情。就个人而言,我宁愿拥有一个 unique_ptr. 的数组(或向量)
  • @Jeffrey 我同意,我只是指出了误解。 OP不会将B的对象存储到A的数组中,不涉及A的数组。
【解决方案2】:

@ChristopherYeleighton 给了你原因。解决方法是使用 unique_ptr 数组,而不是使用 unique_pointer 指向数组。

std::unique_ptr<A> a_arr[2048] = {std::make_unique<B>()};

或者,std::vectorunique_ptr&lt;A&gt; 也可以。

您从中获得的主要好处是,您现在可以在 a_arr 中拥有指向不同派生类的指针。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 2015-05-16
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多