首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >矢量槽基准中的放置和修改对象

矢量槽基准中的放置和修改对象
EN

Stack Overflow用户
提问于 2018-08-02 15:57:21
回答 1查看 27关注 0票数 0

我有这个简单的生物和人工智能类。目标是将人工智能插入一个生物,并提供给该生物的参考。

代码语言:javascript
运行
复制
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;
};

AI

代码语言:javascript
运行
复制
class AI
{
public:
    explicit AI(Creature& creature) : m_creature(creature) {}

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

private:
    Creature& m_creature;
};

现在,根据行动顺序,当我创造生物和设定人工智能时,我得到了不同的结果,并且不明白为什么。

示例1:不工作。只有最后一个生物有一个有效的人工智能。

代码语言:javascript
运行
复制
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: --它运行得很好

代码语言:javascript
运行
复制
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不能工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-02 16:15:57

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

在您的Creature类中存储对AI的引用,在第一个示例中它将失效,因为在获得引用之后将对象添加到向量中。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51657818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档