gpt4 book ai didi

c++ - std::move() 的错误用法?

转载 作者:太空宇宙 更新时间:2023-11-03 10:29:36 27 4
gpt4 key购买 nike

下面是一段代码,我如何实现一个链表以通过我的游戏选项遍历 currentElem 指针。此代码运行良好。然而,出于测试目的,我从 OptionElem 类的析构函数写入了一个日志文件,这样我就可以计算出有多少个 OptionElem 对象一起被实例化了。日志文件中有 9 个条目。所以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 的建议对下面的类似代码进行了相同的更改,并将日志文件更改为 3 个条目,因此当使用 emplace_back 方法而不是将局部变量移动到 vector 时,只有 3 个 OptionElem 对象被实例化。我认为这更有效,因为更少的对象被实例化用于相同的操作(将它们添加到 vector 中)

最佳答案

移动对象不会使该对象神奇地消失。它只是窃取对象的内容(如果正确实现了移动构造函数,那就是)放入新对象。原始对象仍然存在并且最终应该被销毁,并且每个移动仍然涉及另一个对象的构造,该对象最终也将被销毁。

或许是“搬”字有问题。它并不真正涉及移动内存中的对象 - 它真正涉及的是将对象的内容移动到新对象。

无论如何,您可能对 emplace_back 函数感兴趣,该函数就地构造 vector 元素:

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,这样就更容易理解了吧?

关于c++ - std::move() 的错误用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20845166/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com