2

我在正确使用 C++ 中的内置和引用时遇到问题。我有一个名为“Entity”的类的实例,它是在 main() 函数中创建的。我还有一个名为“Simulation”的类的实例 Simulation 类有一个名为:addEntity(Entity e) 的函数 我认为将实例传递给这个函数只会创建它的副本,因为 Simulation 类然后使用这个实例来改变是数据。数据更改后,main() 中的实例保持其默认值。

代码:

这是 addEntity 函数:

void Simulation::addEntity(Entity& entity)
{
    simulation_entities.push_back(std::reference_wrapper<Entity>{entity});

}

此函数使用 Entity 实例来调用它们的公共函数。

void Simulation::simThread()
{

    while(simulation_state == SimulationState::Running)
    {
        auto start = std::chrono::system_clock::now();
        for (int i = 0; i<simulation_entities.size(); i++)
        {
            Entity e = simulation_entities[i];
            e.tick(simulation_entities);
        }
        auto end = std::chrono::system_clock::now();

        auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
        std::this_thread::sleep_for(simulation_speed - elapsed);
    }

}

这是改变实体实例内部变量的tick方法

void Entity::tick(vector<std::reference_wrapper<Entity>> e)
{
    std::cout << Entity::x << std::endl;
    Entity::x += entity_velocity[0];
    x += entity_velocity[0];
    y += entity_velocity[1];
    z += entity_velocity[2];
    std::cout << "after " << Entity::x << std::endl;
}

但是当我在它应该被上面的代码编辑之后尝试使用实例时,它仍然保留它的默认值......

4

1 回答 1

0

好的,通过将 e 变量作为参考解决了问题。感谢@MilesBudnek,他在评论中指出了这一点。

于 2021-10-18T18:25:13.467 回答