如何向向量插入兼容的唯一指针?

时间:2013-09-30 14:29:36

标签: c++ unique-ptr

例如,我有两个类ABB源自A

class A {};
class B : public A {};

我有一个A唯一指针的向量,我可以推回一个指向向量的唯一指针。

vector<unique_ptr<A>> vA;
unique_ptr<A> a(new A);
vA.push_back(std::move(a));

(1)如何推回B的唯一指针?

vector<unique_ptr<A>> vA;
unique_ptr<B> b(new B);
vA.push_back(std::move(b)); //?

(2)如果向量是B,那么如何推回A的唯一指针(假设它是向下投射的)

vector<unique_ptr<B>> vB;
unique_ptr<A> a(new B);
vB.push_back(std::move(a)); //?

2 个答案:

答案 0 :(得分:5)

  

(1)如何推回B的唯一指针?

正如你所做的那样。这不适合你吗?如果没有,你会得到什么错误?

  

(2)如果向量用于B,如何推回A的唯一指针

通常你不应该,因为没有办法判断指针是否实际指向B。如果你真的知道你在做什么,那么就像

那样可怕
vB.push_back(unique_ptr<B>(static_cast<B*>(a.release())));

应该做你想做的事。对于多态类型,您可以使用dynamic_cast(如果转换失败,请注意不要泄漏对象)以使其更安全。

答案 1 :(得分:0)

1)

您可以使用

unique_ptr<A> b(new B);
vA.push_back(std::move(b));

将指向B的指针插入向量。

2)

我不是百分百肯定这个,但如果这是一个安全的沮丧,你可能能做到

unique_ptr<B> a(dynamic_cast<B*>(new A));
vB.push_back(std::move(a));

需要注意的重要事项是类型匹配。如果您的向量为unique_ptr<A>,则需要传入unique_ptr<A>个值。但是,您可以从指向B的指针构造一个unique_ptr<A>,就像我在1中所做的那样。希望这有点帮助。