我有一個自定義galaxy類,它有一個自定義屬性pos。
pos是另一個自定義類的實體Vector3D。AVector3D有性質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 撰寫代碼,而且我在這方面花費的時間比我想承認的要多。
uj5u.com熱心網友回復:
auto 回傳物件的副本,因此原始物件是復制的,而不是修改的。然后,您正在更改原始物件的副本。使用 & 將使您參考原始的,以便您可以更改它。
for (auto & g : galaxies) {
Vector3D accel = Vector3D();
for (auto & g2 : galaxies) {
if (g != g2) {
accel = g.getGravityAccelBy(g2);
}
}
g.updateStateVectors(accel, dt);
}
uj5u.com熱心網友回復:
該回圈正在創建tofor (auto g : galaxies) {元素的副本。因此,對 的更改不會保存到。galaxiesgggalaxies
您應該使用對類似元素的參考for (auto& g : galaxies) {。
免責宣告:
我用谷歌搜索
site:stackoverflow.com [c ] range for not updated referencesite:stackoverflow.com [c ] range-based-for not updated referencesite:stackoverflow.com [c ] range-based-for not updatedsite:stackoverflow.com [c ] range-based change value
但找不到重復項。
uj5u.com熱心網友回復:
嘗試使用這種方式,看看它是否有效。
for (auto g& : galaxies) {
Vector3D accel = Vector3D();
for (auto g2 : galaxies) {
if (g != g2) {
accel = g.getGravityAccelBy(g2);
}
}
g.updateStateVectors(accel, dt);
}
因為在 中生成了一個臨時物件(例如:temp_g)for (auto g: galaxies),所以所有更改都應用于臨時物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/455270.html
上一篇:回圈內的C 單行If-Else
