下面是代码块,我是如何通过游戏选项实现链接列表来遍历currentElem指针的。这段代码运行良好。但是,只是为了测试目的,我从OptionElem-Class的析构函数中写入了一个LogFile,这样我就可以计算出总共实例化了多少OptionElem对象。日志文件中有9个入口。因此,有9个对象被实例化和销毁。我只期望3个对象(e1、e2和e3),因为我在GameState构造函数中实例化了它们一次,然后将它们移动到optionElems。我不明白其他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的建议对下面类似的代码做了相同的更改,日志文件更改为3个条目,因此只有3个OptionElem对象在使用emplace_back方法时被实例化,而不是将局部变量移动到向量。我认为这更有效,因为为同一操作实例化的对象较少(将它们添加到向量中)
发布于 2013-12-30 18:22:40
移动物体并不会使物体神奇地消失。它只是窃取对象的内容(如果适当地实现了move构造函数,也就是),以便放入新对象。原来的物体仍然存在,最终应该被摧毁,而每一次移动都需要建造另一个物体,最终也会被摧毁。
也许这是“移动”这个词的问题。它实际上并不涉及在内存中移动对象-它真正涉及的是将对象的内容移动到新对象。
无论如何,您可能对构造向量元素的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,这是更容易理解的,对吗?
https://stackoverflow.com/questions/20845166
复制相似问题