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&amp; 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++ 函数不更新变量的主要内容,如果未能解决你的问题,请参考以下文章

C ++:使用父类运算符函数更新子类对象的继承变量

C++ 基础知识汇总 持续更新

如何通知尾部更新到 C++ 窗口中的线程? [读取全局变量的未缓存值]

函数不更新变量

c++八股之多态(持续更新)

MFC - 如何在运行时更新编辑框? (C++)