【发布时间】:2021-05-05 18:50:37
【问题描述】:
我正在创建一个游戏,并尝试学习移动语义/r 值引用。
我有一个类,每帧将Event 添加到vector 中。
60 帧后,我想将所有累积的事件移动到一个新类中(称为Step),该类将存储在另一个vector 中。
我想重复这个过程,所以在移动Event 向量后,它应该重置为空。
#include <vector>
class Event
{
...
}
class Step
{
std::vector<Event> Events;
Step(std::vector<Event>&& InEvents) : Events {InEvents} {}
}
class EventAccumulator
{
std::vector<Event> Events;
std::vector<Step> Steps;
void Update(int FrameCount)
{
Events.push_back(Event());
if (FrameCount % 60 == 0)
{
// Move accumulated events into a new Step.
Step NewStep = Step(std::move(Events));
Steps.push_back(NewStep);
// Reset Events so that we can accumulate future events.
Events = std::vector<Event>();
}
}
}
// Game Loop
int GlobalFrameCount = 0;
EventAccumulator eventAccumulator{};
while (true)
{
eventAccumulator.Update(GlobalFrameCount++);
}
据我了解,Step NewStep = Step(std::move(Events)); 行将“给予”Events 到 NewStep(即不复制向量)。如果我在这方面错了,请纠正我。
我希望Events = std::vector(); 行导致EventAccumulator.Events 被重置为空向量,但我不希望NewStep.Events 被重置。
我的问题是,这段代码会做我想要的吗?
此外,您如何判断这是否适用于所有复杂的类,例如std::vector?我认为这是由类的赋值运算符重载决定的,但我对此感到困惑。
【问题讨论】:
-
你问题后半部分的答案可以在这里找到:stackoverflow.com/questions/9168823/reusing-a-moved-container
-
@NathanOliver 不仅如此。 OP 担心通过重新分配
Events也可能清除新构建的向量。 -
如果你给
Step一个默认构造函数,一个新构造的Step对象将有一个空的Events向量。然后你可以使用std::swap(NewStep,Events, Events)来传输Events into theNewStep`对象的向量,并清空旧的Events对象。可能有更好的方法可以做到这一点,但std::swap是这里的关键。不需要移动构造函数等。
标签: c++ visual-c++ c++17 move-semantics rvalue-reference