gpt4 book ai didi

c++ - 通过引用在 vector 槽中放置和修改对象

转载 作者:行者123 更新时间:2023-11-28 01:30:43 27 4
gpt4 key购买 nike

我得到了这个简单的生物和 AI 类。目标是将一个 AI 插入一个生物,并向所述 AI 提供该生物的引用。

生物

class Creature
{
public:
explicit Creature(std::string&& name) : m_name(name) {}

void setAI(std::shared_ptr<AI>&& behavior)
{ m_behavior = std::move(behavior); }

void greet() { m_behavior->action(); }

const std::string& getName() const { return m_name; }

private:
std::shared_ptr<AI> m_behavior;
std::string m_name;
};

人工智能

class AI
{
public:
explicit AI(Creature& creature) : m_creature(creature) {}

void action() { std::cout << m_creature.getName() << std::endl; }

private:
Creature& m_creature;
};

现在根据创建生物和设置 AI 时的操作顺序,我得到不同的结果,但不明白为什么。

示例 1:不工作。只有最后一个生物具有有效的 AI。

std::vector<Creature> atlas;

Creature& quokka = atlas.emplace_back(Creature("Quokka"));
quokka.setAI(std::make_shared<AI>(quokka));

Creature& wombat = atlas.emplace_back(Creature("Wombat"));
wombat.setAI(std::make_shared<AI>(wombat));

Creature& bilby = atlas.emplace_back(Creature("Bilby"));
bilby.setAI(std::make_shared<AI>(bilby));

for (Creature& creature : atlas) { creature.greet(); }

示例 2:这是完美的

atlas.emplace_back(Creature("Quokka"));
atlas.emplace_back(Creature("Wombat"));
atlas.emplace_back(Creature("Bilby"));

for (Creature& creature : atlas)
{
creature.setAI(std::make_shared<AI>(creature));
}

区别在哪里?为什么示例 1 无法运行?

最佳答案

这是因为当 std::vector 增长时它会重新分配它的内容。这意味着指向该 vector 的所有指针和引用都将失效。

您正在 AI 类中存储对 Creature 的引用,并且在您的第一个示例中它变得无效,因为您在获得之后将对象添加到 vector 中引用文献。

在您的第二个示例中,首先添加所有对象,然后获取对它们的引用。因此,所有引用仍然有效。

关于c++ - 通过引用在 vector 槽中放置和修改对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51657818/

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