Невозможно неявно преобразовать 'bool' в 'int' - обнаружение коллизий

Я пытаюсь создать простой класс обнаружения столкновений для футбольного матча. Вот код:

int Collision(int x1, int y1, int radius1, int x2, int y2, int radius2)  
{  
    int dx = x2 - x1;  
    int dy = y2 - y1;  
    int radii = radius1 + radius2;  
    if ((dx*dy)+(dy*dy)< radii * radii)  
    {  
        return true;  
    }  
    else  
    {  
        return false;  
    }  
}  

Проблема в том, что код возвращает true или false. Visual Studio говорит, что не может неявно преобразовать bool в int, и я это понимаю, но как это исправить? Спасибо за любую помощь.


person Apophis    schedule 21.08.2010    source источник
comment
Вы хотите, чтобы он возвращал int? Если да, то какое значение вы хотели бы представить?   -  person Nathan Taylor    schedule 21.08.2010


Ответы (3)


Определите свою функцию следующим образом:

bool Collision(int x1, int y1, int radius1, int x2, int y2, int radius2)

Теперь вы можете вернуть true или false. Если вы сохраните int, вам нужно будет вернуть целочисленное значение, такое как 0 и 1, но это не выражает намерение функции.

Вы также можете немного сократить свой код:

bool Collision(int x1, int y1, int radius1, int x2, int y2, int radius2)  
{  
    int dx = x2 - x1;  
    int dy = y2 - y1;  
    int radii = radius1 + radius2;  
    return ((dx * dy) + (dy * dy) < radii * radii);
}
person Darin Dimitrov    schedule 21.08.2010
comment
@NeoHaxxor - да, просто, но понимаете ли вы, почему это работает? - person Oded; 21.08.2010
comment
Любая причина для понижения? Пожалуйста, оставьте комментарий при минусовом голосовании. - person Darin Dimitrov; 21.08.2010
comment
почему вы хотите изменить возвращаемый тип функции, вы можете использовать что-то вроде этого int result = (dxdy)+(dydy)‹ radii * radii? 1:0 и повторный результат; - person TalentTuner; 21.08.2010
comment
@saurab, потому что, когда функция должна определить, сталкиваются ли две точки, она должна возвращать значение boolean. Он гораздо яснее выражает свое намерение потребителю. - person Darin Dimitrov; 21.08.2010
comment
смотри мои комментарии, почему ты меняешь тип возвращаемого значения, можно использовать что-то a‹b?1:0, почему ты предлагаешь изменить сам тип возвращаемого значения - person TalentTuner; 21.08.2010
comment
@Дарин: а если он использует эту функцию 1000 мест? - person TalentTuner; 21.08.2010
comment
@saurabh, потому что в данном случае это более уместно. Ничто не мешает вам использовать функцию, которая возвращает логическое значение в 1000 разрядов. - person Darin Dimitrov; 21.08.2010
comment
@Darin: можете ли вы сделать что-то вроде этого int i = GetResult(), и GetResult возвращает true или false без использования приведения - person TalentTuner; 21.08.2010
comment
@saurabh, нет, ты не можешь, это то, что пытался сделать ОП. См. ошибку компилятора, которую он получает. - person Darin Dimitrov; 21.08.2010
comment
я думаю, что если вы можете что-то изменить, не меняя большого количества кода, вы должны предпочесть эту альтернативу до тех пор, пока в вашем дизайне не возникнет какой-то очень серьезной проблемы. - person TalentTuner; 21.08.2010
comment
так что это было моей точкой зрения, изменение типа возвращаемого значения может сломать ваш код во многих местах в этом случае, поэтому используйте что-то, что не нарушает код. - person TalentTuner; 21.08.2010
comment
@saurabh, код уже сломан, и не может быть никаких потребителей этого метода просто потому, что этот метод даже не компилируется. Так что я действительно не понимаю вашу мысль. - person Darin Dimitrov; 21.08.2010

Если вам нужно вернуть переменную true/false, вы должны изменить свою первую строку на это:

bool Collision(int x1, int y1, int radius1, int x2, int y2, int radius2) {
person Tommy    schedule 21.08.2010

Не забудьте исправить свой алгоритм. ((dx***dy**)+(dy*dy)‹ радиусы * радиусы) должно быть: ((dx***dx**)+(dy*dy)‹ радиусы * радиусы)

Как раз тогда, когда вы думаете: Вау! Я исправил эту вещь с int/bool, вы получаете кучу ложных срабатываний.

person Steve H    schedule 21.08.2010