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

时间:2015-02-03 17:18:45

标签: c++

我有一个名为Object的类,它具有以下属性:xPos和yPos。它还具有这些属性的getter和setter。我有另一个名为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;

}

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

2 个答案:

答案 0 :(得分:2)

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

你必须像在上面的例子中那样给函数提供实际的Object作为参考。

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

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

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

只需与reference一起搜索关键字pointerc++,您就会找到大量关于它的文章和教程。

解释一切都超出了范围。

答案 1 :(得分:0)

我在上面的评论中是正确的 - 看看这个功能 -
 bool CollisionDetector::detect(Object a, Object b)
您将对象作为值传递,因此它们被复制到其他位置,并且函数在此副本上运行。如果要更改原始对象,请通过指针或引用传递它们 指针:bool CollisionDetector::detect(Object* a, Object* b)
参考:bool CollisionDetector::detect(Object &a, Object &b)