2016-06-13 2 views
0

Я новичок в программировании на C++, и это моя первая программа на C++. Не стесняйтесь прокомментировать какие-либо улучшения, которые я мог бы сделать или не использовать методы, помимо моих вопросов, чтобы я мог улучшить и остальную часть кода. Программа - простая процедура, которая проверяет, сталкиваются ли шары. Если они сталкиваются, то векторы скорости обоих шаров выступают против. Проблема у меня в том, что функция «checkcollision», похоже, не в состоянии написать обновленную скорость для объекта тестового теста. Я могу вычислить расстояние, но я не могу изменить/написать testball.xspeed. Вы знаете причину этого?C++ function can not write to object

Другой вопрос: я хотел ввести значения положения и скорости в качестве векторов. Поэтому я создал векторный класс. Но я не мог использовать переменные этого типа в классе шара. Как создать векторный объект и использовать его в классе шаров?

Большое вам спасибо!

class vector { 
public: 
    float x; 
    float y; 
    vector(float x_,float y_){ 
     x=x_; 
     y=y_; 
    } 
}; 


class ball { 
public: 
    // vector position; // doesnt work 
    // vector speed; 
    float x; 
    float y; 
    float xspeed; 
    float yspeed; 
    ball(float x_,float y_,float xspeed_,float yspeed_){ 
     x=x_; 
     y=y_; 
     xspeed=xspeed_; 
     yspeed=yspeed_; 
    } 

}; 

void checkcollision(ball testball, ball testball2){ 
    float distance; 
    distance=pow(pow(testball.x-testball2.x,2)+pow(testball.y-testball2.y,2),0.5); 
    if (distance<0.1){ 
     testball.xspeed=-testball.xspeed; 
     testball.yspeed=-testball.yspeed; 
     testball2.xspeed=-testball2.xspeed; 
     testball2.yspeed=-testball2.yspeed; 
     } 

    } 

int main(){ 
     float time=0; 
     float timestep=0.1; 
     float runtime=20; 
     int xmax=10; 
     int ymax=15; 

     ball testball(5,5,2,2); // positionx,y, speed x,y 
     ball testball2(4,5,1,2); 

     for(double i = 0; i <runtime; i = i + timestep) 
     { 
      time=time+timestep; 

      checkcollision(testball,testball2); 
      writeFile(testball.x,testball.y,testball2.x,testball2.y,count); 

     } 

    return 0; 
    } 
+5

Из-за передачи по значению ваша функция изменяет только копию. – melpomene

+0

Вы должны определить другой конструктор для вашего векторного класса (без параметров), чтобы определить его как член класса, как вы бы здесь. 'vector() {}' например. –

+1

Когда вы пишете код, начните с чего-то маленького и простого, который отлично работает, а затем добавьте немного сложности за раз. ** Никогда не добавляйте к коду, который не работает. ** И когда вы просите о помощи с проблемой, попробуйте четко описать проблему; «Я не мог использовать переменные этого типа» мог означать полдюжины вещей. – Beta

ответ

1

Путь ваша функция checkcollision работает на данный момент это будет сделать копию шариковых объектов, которые проходят в, а затем модифицируют копию. В конце функции эти копии выходят за рамки и теряются.

Один из способов достижения желаемого - передать параметры по ссылке. Функция подписи хотел бы это:

void checkcollision(ball& testball, ball& testball2) 

Это означает, что объекты, полученные с помощью функции являются только ссылки на объекты, созданные в основной функции.

Существует множество способов достижения того, что вы пытаетесь сделать. Это всего лишь одно.

+0

Спасибо большое, я попробовал аналогичную вещь, но получил положение «&» неправильно, теперь он работает! –

+0

Еще один вопрос: мне разрешено передавать локальные переменные из главной в другую? Не нужно ли возвращаемое значение от checkcollision до основного? Как насчет подхода к распределению памяти с помощью ball * testball = новый мяч в главном и передать указатель на функцию? Спасибо! –

Смежные вопросы