我有一个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
感谢您的帮助,
答案 0 :(得分:1)
以下代码
cells_({std::make_unique<SnakeCell>(x, y)})
调用此构造函数
deque( std::initializer_list<T> init, const Allocator& alloc = Allocator() );
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
...