0

例如,我有两个班级AB. B源自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)如果向量是 for B,如何推回一个唯一的指针A(假设它是向下转换的)

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

2 回答 2

5

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

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

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

通常您不应该这样做,因为无法判断指针是否实际指向 a B。如果你真的知道自己在做什么,那么可怕的事情就像

vB.push_back(unique_ptr<B>(static_cast<B*>(a.release())));

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

于 2013-09-30T14:38:44.127 回答
0

1)

您可以使用

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

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

2)

我不是 100% 确定这个,但如果它是一个安全的沮丧,你可以做

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

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

于 2013-09-30T14:35:07.197 回答