例如,我有两个类A
和B
。 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)如果向量是B
,那么如何推回A
的唯一指针(假设它是向下投射的)
vector<unique_ptr<B>> vB;
unique_ptr<A> a(new B);
vB.push_back(std::move(a)); //?
答案 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中所做的那样。希望这有点帮助。