如何将对象添加到std :: vector <unique_ptr <obj>&gt;?</unique_ptr <obj>

时间:2014-12-12 23:13:06

标签: c++ c++11 vector unique-ptr raii

问题:
如何将对象添加到std::vector<unique_ptr<obj>>

我有一个班级,这就是我尝试做... ... 下面,我尝试在我的向量中使用std::unique_ptr<Ball>,因为我认为这是最简单的。

class Ball {
public:
    Ball(float x, float y);
    std::vector<std::unique_ptr<Ball>> object;
    // other declarations below...
};


我在这里尝试 push_back 新元素:

Ball ball { 0, 0 };
for (size_t i { 0 }; i != 50; ++i) {
ball.object.push_back(new Ball { 0, 0 });
//        ^ here is the error
}

我不理解我得到的错误 的错误:
error C2664: 'void std::vector<std::unique_ptr<Ball,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>::push_back(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : cannot convert argument 1 from 'Ball *' to 'std::unique_ptr<Ball,std::default_delete<_Ty>> &&'

3 个答案:

答案 0 :(得分:7)

使用push_back时,您需要创建unique_ptr。由于打字过多且容易出错,您可以使用emplace_back来转发您的球对象。在C ++ 14中,make_unique可用,应该是首选。

for (size_t i { 0 }; i != 50; ++i) {
    ball.balls.emplace_back(new Ball { 0, 0 });
}

答案 1 :(得分:3)

如果使用vector<unique_ptr<T>>,则无需显式释放内存,因为在调用封闭类的析构函数时它会自动释放。

您必须创建unique_ptr<Ball>对象,不能直接传递Ball*。最佳解决方案是使用std::make_unique<Ball>(0,0)

答案 2 :(得分:0)

既然您说您正在寻找最简单的事情,请使用std::vector<Ball>代替std::vector<std::unique_ptr<Ball>>。无需添加指针所有权的复杂性。