C++ class 属性未正确更新
C++ class properties not updating properly
我有一个自定义 galaxy
class,它有一个自定义 属性 pos
。
pos
是另一个自定义 class Vector3D
的实例。
Vector3D
具有属性 x
、y
、z
。 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) {
正在创建 galaxies
到 g
的元素副本。因此,对 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),所以所有更改都应用于临时对象。
我有一个自定义 galaxy
class,它有一个自定义 属性 pos
。
pos
是另一个自定义 class Vector3D
的实例。
Vector3D
具有属性 x
、y
、z
。 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) {
正在创建 galaxies
到 g
的元素副本。因此,对 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),所以所有更改都应用于临时对象。