使用unique_ptr

时间:2017-12-06 14:56:52

标签: c++ memory smart-pointers

我有一个Snake类,它由多个SnakeCell

组成
struct SnakeCell
{
    SnakeCell(size_t x, size_t y) : origin_(x, y) {}

    std::pair<size_t, size_t> origin_;

};

class Snake
{
public:
    Snake(size_t x, size_t y ) : cells_({std::make_unique<SnakeCell>(x, y)}) {}


private:
    std::deque<std::unique_ptr<SnakeCell>> cells_;

};

最初使用一个Snake创建SnakeCell

为什么使用蛇形细胞指针? 通常会修改细胞,例如细胞。他们的x和y组件。在它发生时直接修改它们是有意义的,而不是创建副本并重新初始化整个cells_双端队列。

为什么要使用unique_ptr 这就是我不确定它是否是正确使用的指针。最初的想法是确保在删除蛇本身时从内存透视图中删除每个单元格。从设计角度来看,Snake对象将是管理其cells唯一对象,因此使用unique_ptr而不是{{1}是有意义的但是我认为这是我对智能指针的理解不正确的地方。

无论如何,编译器在使用unique_ptr

时会抱怨

shared_ptr

感谢您的帮助,

1 个答案:

答案 0 :(得分:1)

以下代码

cells_({std::make_unique<SnakeCell>(x, y)})

调用此构造函数

deque( std::initializer_list<T> init, 
       const Allocator& alloc = Allocator() );
     

from cppreference

std::initializer_list<T>是一个const T[]const对象无法移动 - 解释您获得的错误。

可能的解决方法:

Snake(size_t x, size_t y) 
{
    cells_.emplace_back(std::make_unique<SnakeCell>(x, y));
}



我讨厌initializer_list ...