如何在C++中更改另一个类函数中的对象属性?

How to change an object's properties in another class' function in C++?

本文关键字:类函数 对象 属性 另一个 C++      更新时间:2023-10-16

我有一个名为Object的类,它具有以下属性:xPos和yPos。它还具有这些属性的获取者和二传手。我还有另一个叫做CollisionDetector的类,它有一个名为detect的函数,可以接收两个物体并检测它们是否碰撞。如果有,那么它使用 setXPos() 和 setYPos() 函数将它们彼此推开。但是,它不会改变值,我试图找出原因?

Object::Object(){
}
Object::Object(float x, float y) {  //constructor
    xPos = x;
    yPos = y;
}
float Object::getXPos(){
    return xPos;
}
float Object::getYPos(){
    return yPos;
}
void Object::setXPos(float temp){
    xPos = temp;
}
void Object::setYPos(float temp){
    yPos = temp;
}
char Object::getType(){
return type;
}
bool CollisionDetector::detect(Object a, Object b){
    double size = 45; //Set size
    double xPosition = a.getXPos() - b.getXPos();
    double yPosition = a.getYPos() - b.getYPos();
    double sumRadius = (size/2 + 1) + (size/2 + 1);
    double radiusSquared = sumRadius * sumRadius;
    double distanceSquared = (xPosition * xPosition) + (yPosition * yPosition); //square the distances
    if (distanceSquared <= radiusSquared)
    {
        //Check for collisions between tanks
        if(a.getType() == 't' && b.getType() == 't'){
            if(a.getXPos() > b.getXPos()){
                a.setXPos(a.getXPos() + 10);
            }
            else if(a.getXPos() < b.getXPos()){
                a.setXPos(a.getXPos() - 10);
            }
            //Same for y direction
            if(a.getYPos() > b.getYPos()){
                a.setYPos(a.getYPos() + 10);
            }
            else if(a.getYPos() < b.getYPos()){
                a.setYPos(a.getYPos() - 10);
            }
        }
        return true;
    }
    return false;

}

该函数从主调用:collisionDetector.detect(userTank, enemyTank);

bool CollisionDetector::detect(Object &a, Object &b)

您必须像我在上面的示例中所做的那样为函数提供实际对象作为参考。

现在,您正在创建变量的副本,因此不会修改原始变量。

不同的可能选项是指向对象的指针,例如:

bool CollisionDetector::detect(Object *a, Object *b)

只需搜索关键字referencepointerc++,您就会找到大量有关它的文章和教程。

解释一切将超出范围。

我在上面的评论中是对的 - 看看这个函数 -

bool CollisionDetector::detect(Object a, Object b)您将对象作为值传递,因此它们在其他方面被复制,并且函数对此副本进行操作。如果要更改原始对象,请通过指针或引用传递它们。
指针 : bool CollisionDetector::detect(Object* a, Object* b)
参考 : bool CollisionDetector::detect(Object &a, Object &b)