2015-02-03 4 views
1

У меня есть класс Object, который имеет следующие атрибуты: xPos и ​​yPos. Он также имеет геттеры и сеттеры для этих атрибутов. У меня есть еще один класс CollisionDetector, который имеет функцию, называемую обнаружением, которая принимает два объекта и обнаруживает, столкнулись ли они. Если они есть, то он отталкивает их друг от друга с помощью функций setXPos() и setYPos(). Однако это не меняет ценности, и я пытаюсь понять, почему?Как изменить свойства объекта в функции другого класса на C++?

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);

+0

(минимальный) Код, пожалуйста, люди не могут без этого помочь. –

+1

Опубликуйте [MCVE] (http://stackoverflow.com/help/mcve). Если это невозможно, отправьте соответствующий код. –

+1

Мы понимаем, что вы пытаетесь найти решение, но без кода мы не можем решить проблему. – Sridhar

ответ

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

Вы должны дать функцию реального объекта в качестве ссылки, как я сделал в приведенном выше примере.

Прямо сейчас вы создаете копию переменных, чтобы не изменять оригинал.

Различные возможный вариант будет с указателем на объект, как:

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

Просто поиск ключевых слов, reference и pointer в сочетании с c++ и вы найдете массу статей и учебных пособий по этому поводу.

Объяснение всего будет за пределами сферы применения.

+0

Спасибо за помощь, теперь он работает! – BillyMays

+0

@ Anthonyt123 подумайте о принятии ответа, который, как вы нашли, решил проблему для вас и был вам понятен. Слева от ответа это маленький зеленый тик. Таким образом, другие люди прямо видят, что вы нашли в качестве решения. – deW1

0

я был прав в комментарии выше - посмотрите на эту функцию -
bool CollisionDetector::detect(Object a, Object b)
Вы передаете объекты как значение, поэтому они копируются elsewere, и функция работает в этой копии. Если вы хотите изменить исходные объекты, передайте их указателем или ссылкой.
Указатель: bool CollisionDetector::detect(Object* a, Object* b)
Ссылка: bool CollisionDetector::detect(Object &a, Object &b)

+0

Я только начал изучать C++, как бы я это сделал? – BillyMays

+0

Затем используйте второй вариант (ссылка) - просто измените функцию прототипа, как я. Все будет работать. – newfolder

+0

Это сработало! Большое спасибо! – BillyMays