C++ 从复数*到双精度的转换无效

C++ 从复数*到双精度的转换无效,c++,casting,double,C++,Casting,Double,我必须返回两个复数之间的距离,我得到的错误在返回行中,表示从复数*到双精度的无效转换 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());

我必须返回两个复数之间的距离,我得到的错误在返回行中,表示从复数*到双精度的无效转换

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;
}
你能告诉我我做错了什么吗?
更不用说老师给我们定义了这个函数为static double,但是我遇到了另一个错误,所以我只是删除了static。

不支持将指向复杂对象的指针转换为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;
}

不支持将指向复合体的指针强制转换为双精度。我们甚至不清楚为什么要在这里创建指针,而不仅仅是在堆栈上分配它

例如:

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

问题是,双精度运算不能同时携带复数的实部和虚部

我相信两个复数之间的距离是差平方和的平方比

所以,你的代码应该是

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;
}
正如H2CO3所指出的,使用std::Hypto…so可能更安全

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

问题是,双精度运算不能同时携带复数的实部和虚部

我相信两个复数之间的距离是差平方和的平方比

所以,你的代码应该是

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;
}
正如H2CO3所指出的,使用std::Hypto…so可能更安全

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

最简单的解决方案是使用标准库的类模板。您可以使用减法和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;
}

最简单的解决方案是使用标准库的类模板。您可以使用减法和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;
}

如果我没记错的话,这个距离可以用毕达哥拉斯来计算——所以创建 不需要远距离的复杂对象

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

如果我没记错的话,这个距离可以用毕达哥拉斯来计算——所以创建 不需要远距离的复杂对象

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

您知道C++中有复杂的类型吗?因为如果我不这样做,XCODER说:从“复杂*”转换为非标量类型的“复杂”请求。这是我写C++的第一天[忘了提,不要对我苛刻]我想你应该把你的数字的绝对值,AFAIK -这是如何定义距离。@ JoachimPileborg,但它显然是HW作业,要求创建这样的类,没有什么错误在发明车轮的教育目的,没有必要使用内置的库。你知道C++中有复杂的类型吗?因为如果我不这样做,XCODE说:从“复杂*”转换为非标量类型的“复杂”请求。这是我写C++的第一天[忘了提,不要对我苛刻]我想你应该把你的数字的绝对值,AFAIK -这是如何定义距离。@ JoachimPileborg,但它显然是HW作业,要求创建这样的类,没有什么错误在发明车轮的教育目的,使用内置库没有意义。使用std::hypotr,i代替sqrtr*r+i*i。我不知道该说什么,根据我所了解的,距离是:| z1-z2 |[…]@Teodora-对,这是正确的,如果你想要你的距离是一个复数,你会这么做。但是,既然你要求将距离作为标量,你必须使用毕达哥拉斯定理xx+yy=z*z并求解z。如果二维是X/Y或实/虚,这没有任何区别,毕达哥拉斯仍然是对的。海波不是std@H2CO3更好的是,使用std::complex类模板和支持的操作。而不是sqrtr*r+i*i,使用std::hypor,i。我不知道该说什么,根据我所了解的,距离是:| z1-z2 |[…]@Teodora-对,这是正确的,如果你想要你的距离是一个复数,你会这么做。但是,既然你要求将距离作为标量,你必须使用毕达哥拉斯定理xx+yy=z*z并求解z。如果二维是X/Y或实/虚,这没有任何区别,毕达哥拉斯仍然是对的。海波不是std@H2CO3更好的方法是使用std::complex类模板和支持的操作。