错误地使用std :: move()?

时间:2013-12-30 18:20:23

标签: c++ c++11

下面是一段代码我是如何通过我的游戏选项实现链接列表与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对象被实例化。我认为这更有效,因为较少的对象被实例化为相同的操作(将它们添加到向量)

1 个答案:

答案 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,这更容易理解,对吗?