C++ class 属性未正确更新

C++ class properties not updating properly

我有一个自定义 galaxy class,它有一个自定义 属性 pospos 是另一个自定义 class Vector3D 的实例。 Vector3D 具有属性 xyz。 Vector3D的算术运算是基本的矢量数学,相关的如下:

Vector3D Vector3D::operator+(const Vector3D& vec) {
    return Vector3D(x + vec.x, y + vec.y, z + vec.z);
}

Vector3D &Vector3D::operator+=(const Vector3D& vec) {
    x += vec.x;
    y += vec.y;
    z += vec.z;
    return *this;
}

Vector3D Vector3D::operator*(double val) {
    return Vector3D(x * val, y * val, z * val);
}

galaxy.cpp有以下几种方法:

void galaxy::updatePos(double dt) {
    pos += vel * dt;
}

void galaxy::updateVel(Vector3D accel, double dt) {
    vel += accel * dt;
}

void galaxy::updateStateVectors(Vector3D accel, double dt) {
    updateVel(accel, dt);
    updatePos(dt);
}

main.cpp 调用方法 updateStateVectors 如下:

// within some while() loop

for (auto g : galaxies) {
    Vector3D accel = Vector3D();
    for (auto g2 : galaxies) {
        if (g != g2) {
            accel += g.getGravityAccelBy(g2);
        }
    }
    g.updateStateVectors(accel, dt);
}

(星系是 std::vector<galaxy>

问题是,在此 for 循环中对 g.pos(或 g.vel)所做的更改似乎不会持续存在。 while 循环的每次迭代,我都看到 g.pos 返回到其原始值,忽略它之前在 for 循环中经历的更改。我错过了什么?

这可能最终会成为一个非常愚蠢的错误,但我主要是在 Python 中编写代码,而且我在这上面花费的时间比我愿意承认的要多。

auto returns对象的一个​​副本,所以原来的是复制的,没有修改。然后,您将更改原始对象的 copy。 使用 & 将使您引用 原始 一个,以便您可以更改它。

for (auto & g : galaxies) {
    Vector3D accel = Vector3D();
    for (auto & g2 : galaxies) {
        if (g != g2) {
            accel += g.getGravityAccelBy(g2);
        }
    }
    g.updateStateVectors(accel, dt);
}

循环 for (auto g : galaxies) { 正在创建 galaxiesg 的元素副本。因此,对 g 的更改不会保存到 galaxies.

您应该改用 for (auto& g : galaxies) { 等元素的引用。


免责声明:

我用谷歌搜索

  • site:whosebug.com [c++] range for not updated reference
  • site:whosebug.com [c++] range-based-for not updated reference
  • site:whosebug.com [c++] range-based-for not updated
  • site:whosebug.com [c++] range-based change value

但找不到重复项。

尝试使用这种方式,看看是否有效。

for (auto g& : galaxies) {
    Vector3D accel = Vector3D();
    for (auto g2 : galaxies) {
        if (g != g2) {
            accel += g.getGravityAccelBy(g2);
        }
    }
    g.updateStateVectors(accel, dt);
}

因为在 for (auto g: galaxies) 中生成了一个临时对象(例如:temp_g),所以所有更改都应用于临时对象。