2013-02-21 6 views
1

Мне нужно вернуть расстояние между двумя комплексными числами, и ошибка, которую я получаю, находится в обратной линии, в которой говорится: «Недопустимый листинг из Сложного * для двойного».Недопустимый литой состав из комплекса *, чтобы удвоить

double Complex::distance(const Complex &a, const Complex &b) 
{ 
    Complex *number = new Complex(); 

    number->modificaRe(a.real() - b.real()); 
    number->modificaIm(a.imag() - b.imag()); 

    return (double)number; 
} 

Не могли бы вы рассказать мне, что я делаю неправильно? Не говоря уже о том, что учитель дал нам определение этой функции как «статического двойника», но я получил еще одну ошибку, поэтому просто удалил «статический».

+1

Ваше известно, что C++ имеет сложный тип в стандартной библиотеке [] (http://en.cppreference.com/w/cpp/numeric/complex)? –

+0

Потому что, если я этого не делаю, xCode говорит: «Запрошенное преобразование из« Complex * »в нескалярный тип« Complex ». Это первый день, когда я пишу C++ [забыл упомянуть, не будьте суровы на мне] – Teodora

+0

Я думаю, вы должны принять * абсолютное значение * вашего 'number', AFAIK - так определяется расстояние. – amit

ответ

1

Если я правильно помню, расстояние можно вычислить с помощью Пифагора - так создание комплекса объектов на расстоянии() не является необходимым.

double Complex::distance(const Complex &a, const Complex &b) 
{  
    double x = a.real() - b.real(); 
    double y = a.imag() - b.imag(); 

    return sqrt(x * x + y * y); 
} 
0

Кастинг от указателя до Complex до double не поддерживается. Даже не понятно, почему вы создаете указатель здесь, а не просто выделяете его в стеке.

Например:

double Complex::distance(const Complex &a, const Complex &b) 
{ 
    Complex number; 

    number.modificaRe(a.real() - b.real()); 
    number.modificaIm(a.imag() - b.imag()); 

    return (double)number; 
} 
2

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

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

Итак, вы код должен быть ...

double Complex::distance(const Complex &a, const Complex &b) 
{ 
    double number; 

    double r = a.real() - b.real(); 
    double i = a.imag() - b.imag(); 

    number = sqrt(r*r + i*i); 

    return number; 
} 

Как Н2СО3 указывает, что может быть SAFTER использовать зЬй :: hypot ... так

double Complex::distance(const Complex &a, const Complex &b) 
{ 
    return std::hypot(a.real() - b.real(), a.imag() - b.imag()); 
} 
+0

Вместо 'sqrt (r * r + i * i)', используйте 'std :: hypot (r, i)'. – 2013-02-21 16:47:42

+0

Я не знаю, что сказать, из того, что я узнал, расстояние: | z1-z2 | [..] – Teodora

+0

большое спасибо, ребята! – Teodora

1

Самым простым решением было бы для использования шаблона класса стандартной библиотеки std::comlpex. Вы можете использовать вычитание и std::abs, чтобы получить «расстояние»:

#include <complex> 
#include <iostream> 

template <typename T> 
T complex_distance(const std::complex<T>& a, const std::complex<T>& b) 
{ 
    return std::abs(b-a); 
} 

int main() 
{ 
    std::complex<double> c1(-1,-1); 
    std::complex<double> c2(2,2); 
    std::cout << (c2-c1) << std::endl; 
    std::cout << complex_distance(c2,c1) << std::endl; 
} 
Смежные вопросы