下面是一段代码我是如何通过我的游戏选项实现链接列表与currentElem指针进行遍历的。 这段代码运行良好。但是,出于测试目的,我从OptionElem-Class的析构函数写入LogFile,因此我可以计算已经实例化了多少个OptionElem对象。 日志文件中有9个Entrys。所以9个对象已被实例化并被破坏。我只期望3个对象(e1,e2和e3),因为 我在GameState构造函数中实例化了一次,然后将它们移动到optionElems-vector。我不明白其他6个OptionElem对象的实例化位置。
#include "OptionElem.h"
#include <vector>
class GameState
{
std::vector<OptionElem> optionElems;
OptionElem* currentElem;
public:
GameState();
};
GameState::GameState()
{
OptionElem e1("Start Game");
optionElems.push_back(std::move(e1));
OptionElem e2("Options");
optionElems.push_back(std::move(e2));
OptionElem e3("Exit");
optionElems.push_back(std::move(e3));
optionElems[0].Connect(optionElems[1]);
optionElems[1].Connect(optionElems[2]);
currentElem = &optionElems[0];
}
编辑: 我改变了行
OptionElem e1("Start Game");
optionElems.push_back(std::move(e1));
为:
optionElems.emplace_back("Start Game");
并对sftrabbit建议的下面的类似代码进行了相同的更改,并且Logfile更改为3个条目,因此在使用emplace_back方法而不是将局部变量移动到向量时,只有3个OptionElem对象被实例化。我认为这更有效,因为较少的对象被实例化为相同的操作(将它们添加到向量)
答案 0 :(得分:8)
移动一个物体不会使该物体神奇地消失。它只是窃取对象的内容(如果移动构造函数正确实现,即),以放入新对象。原始对象仍然存在,最终应该被销毁,每次移动仍然涉及另一个对象的构造,最终也将被销毁。
也许这是“移动”这个词的问题。它并不真正涉及在内存中移动对象 - 它真正涉及的是将对象的内容移动到新对象。
无论如何,您可能对构建矢量元素的emplace_back
函数感兴趣:
optionElems.emplace_back("Start Game");
optionElems.emplace_back("Options");
optionElems.emplace_back("Exit");
或者甚至只是初始化你的std::vector
:
std::vector<OptionElem> optionElems = {"Start Game", "Options", "Exit"};
关于命名约定的简要说明:调用集合somethingElems
会在名称中放入有关类型的信息。你可以称它为options
,很明显它有元素,因为它是复数(不说Elems
)。然后currentElem
会被称为currentOption
,这更容易理解,对吗?