我有这个简单的生物和人工智能类。目标是将人工智能插入一个生物,并提供给该生物的参考。
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
class AI
{
public:
explicit AI(Creature& creature) : m_creature(creature) {}
void action() { std::cout << m_creature.getName() << std::endl; }
private:
Creature& m_creature;
};
现在,根据行动顺序,当我创造生物和设定人工智能时,我得到了不同的结果,并且不明白为什么。
示例1:不工作。只有最后一个生物有一个有效的人工智能。
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不能工作?
发布于 2018-08-02 16:15:57
这是因为当一个std::vector
增长时,它会重新分配它的内容。这意味着所有指针和引用到该向量都将失效。
在您的Creature
类中存储对AI
的引用,在第一个示例中它将失效,因为在获得引用之后将对象添加到向量中。
在第二个示例中,首先添加所有对象,然后接受对它们的引用。因此,所有引用仍然有效。
https://stackoverflow.com/questions/51657818
复制相似问题