C++ 函数不更新变量
Posted
技术标签:
【中文标题】C++ 函数不更新变量【英文标题】:C++ function not updating variables 【发布时间】:2020-10-25 02:06:41 【问题描述】:我有一个程序旨在模拟 C++ 中的球弹跳并保存它的位置和速度。我有一个球类来一次模拟其中的许多,由于某种原因,当我运行更新函数来更新球时,没有任何变量更新。
球类:
class Ball
public:
float x;
float y;
float xVel;
float yVel;
float gravity;
float elasticity;
float radius;
float friction;
float width = 200;
float height = 200;
void update() //Only simulate gravity for testing purposes
this->yVel += this->gravity;
std::cout << this->yVel << this->gravity << std::endl;
void init()
this->x = randomf(0, width);
this->y = randomf(0, height);
this->xVel = randomf(-10, 10);
this->yVel = randomf(-0.5, 0.5);
this->gravity = randomf(-1, 1);
this->elasticity = randomf(0.25, 1);
this->radius = randomf(2.5, 50);
this->friction = randomf(0.25, 1);
;
由于某种原因,当我调用 update()
时,没有任何变量更新,只产生输出
@"0.0241846 0.0655345\r\n"
@"0.0241846 0.0655345\r\n"
@"0.0241846 0.0655345\r\n"
@"0.0241846 0.0655345\r\n"
@"0.0241846 0.0655345\r\n"
@"0.0241846 0.0655345\r\n"
@"0.0241846 0.0655345\r\n"
我如何调用 update 是我有一个 for()
循环,可以进行尽可能多的迭代,目前为 500,并且更新在其中。
这个程序容易发生的另一件事是我的随机函数
for()
循环:
for (int i = 0; i < iter; i++)
balls.clear(); //Clear array
for (int j = 0; j < batch; j++) //Create new balls
Ball ball;
ball.init();
balls.push_back(ball);
for (int j = 0; j < simLen; j++) //For simulation length update all balls
for (int k = 0; k < batch; k++)
Ball ball = balls.at(k);
ball.update();
std::vector<float> temp; //Store ball info to be saved later
temp.push_back(ball.x);
temp.push_back(ball.y);
temp.push_back(ball.xVel);
temp.push_back(ball.yVel);
if (j % 2 == 0)
y.push_back(temp);
else
temp.push_back(ball.gravity);
temp.push_back(ball.elasticity);
temp.push_back(ball.radius);
temp.push_back(ball.friction);
x.push_back(temp);
temp.clear();
std::cout << "Simulation " << i + 1 << " out of " << iter << " finished, batch size " << batch << std::endl;
随机数函数:
float randomf(float LO, float HI)
return LO + static_cast<float>(rand()) / (static_cast<float>(RAND_MAX / (HI - LO)));
大多数时候生成相同的值。 我不知道到底是什么导致了这个,求助。
【问题讨论】:
我调用 update 的方式是我有一个 for() 循环,可以进行任意多次迭代,目前为 500,更新在其中。 - - 发布代码,不要只是描述它。 刚刚做到了,谢谢Ball ball = balls.at(k);
-- 你知道ball
是一个副本,对吧?你真的不想要一个参考,即Ball& ball = balls.at(k);
吗?
我不知道lol,是java开发者,谢谢
"这些不是你要找的变量" :-)
【参考方案1】:
Ball ball = balls.at(k);
这会从向量中检索 Ball
对象之一,并创建一个名为 ball
的新对象,这是它的副本。
ball.update();
这会在此 ball
对象上调用 update()
。由于它是向量中原始对象的副本,因此当然对向量中的对象没有任何作用。
std::vector::at
返回一个引用,因此您只需将ball
设为对数组中对象的引用:
Ball &ball = balls.at(k);
请参阅您的 C++ 教科书,以获得关于什么是引用以及它们如何工作的更完整描述。
【讨论】:
天哪,谢谢你,我通常是一个java程序员所以我不知道这个 Java 程序员永远不应该被允许在 C++ 领域的神圣大厅里漫游,这就像让记事本用户编辑 Linux 代码,或者允许猫在狗收容所:-) 注意笑脸,我不尽管我的妻子通常会说,但我认为这是一个幽默的评论,但我需要任何悲伤。 如果您查看之前发布的此问题的所有副本,您现在应该很清楚为什么 *** 需要minimal reproducible example。您认为问题出在您的update()
函数上,所以您只展示了这一点。那不是问题所在。附言C++ 不是 Java。 C++ 中的对象的工作方式与 Java 中的完全不同。如果您在学习 C++ 时完全忘记了有关 Java 的所有知识,那么您会帮自己一个大忙,否则您会一直被这样绊倒。这不是 Java 和 C++ 之间唯一的根本区别。以上是关于C++ 函数不更新变量的主要内容,如果未能解决你的问题,请参考以下文章