我的游戏主循环看起来像这样:
std::vector<std::unique_ptr<State>> states;
for(size_t i = 0; i < states.size(); i++)
{
states[i]->Update();
states[i]->Draw();
}
但是,他们是一个缺陷。我无法在迭代期间修改向量(删除状态),因为如果我删除当前状态,则迭代打开然后它会明显中断,因为没有状态可以调用更新和绘制。所以我认为制作一个应该添加到states
向量的状态向量并创建一个应该删除到states
向量的状态向量是个好主意。然后在循环结束后修改states
向量,迭代中不会出现任何问题。
std::vector<std::unique_ptr<State>> states;
std::vector<std::unique_ptr<State>> statesToBeAdded;
std::vector<std::unique_ptr<State>> statesToBeRemoved;
for(size_t i = 0; i < states.size(); i++)
{
states[i]->Update();
states[i]->Draw();
}
for(size_t i = 0; i < statesToBeAdded.size(); i++)
{
states.push_back(std::move(statesToBeAdded[i]));
}
statesToBeAdded.clear();
for(size_t i = 0; i < statesToBeRemoved.size(); i++)
{
states.erase(std::remove(states.begin(), states.end(), statesToBeRemoved[i]), states.end());
}
statesToBeRemoved.clear(); //error is thrown here
我无法从states
向量中删除状态,statesToBeRemoved.clear()
行会出现错误,我认为这是因为当我调用states.erase(...)
行时会删除该元素来自states
向量,从而使statesToBeRemoved
向量中的相同元素无效,因为该元素指向不再存在的对象。
你不能只删除一个std :: unique_ptr而不破坏指针指向的内容,所以我认为没有办法从states
向量中删除元素而不会使statesToBeRemoved
向量中的元素无效{1}}向量。那怎么解决这个问题呢?
感谢。
答案 0 :(得分:0)
不同的指针类型可以满足不同的所有权语义:
unique_ptr
用于唯一所有权,这就是您当前代码不起作用的原因shared_ptr
用于共享所有权 - 当管理对象的最后一个shared_ptr
超出范围时,它将被销毁*
)并没有真正说出他们正在建模的语义,但你必须手动强制执行所有约束 - 这就是使它们变得危险的原因。然而,对于那些从未拥有对象所有权的指针,它们是安全的(并且在我看来是明智的选择)。所以:你的statesToBeAdded
是安全的,只要你可以保证你在states
中没有任何东西。 statesToBeRemoved
是不同的:对象已经存在于states
中,让states
取得对象的所有权是有意义的 - 因此原始指针对于{{{{{{{ 1}}。
请注意,所有这些都是基于您展示的几行代码,具体取决于您可能在statesToBeRemoved
而不是State
中存储unique_ptr<State>
的情况。 {1}}等等......