如何在 Class/Object C++ 中使用复数

How to use Complex numbers in Class/Object C++

我正在努力将复数实现到我的代码中。当我编译时,它会给我随机数。它应该使用虚数 i = sqrt(-1)。它应该输出 realPart + imaginaryPart * i.

#include <iostream>
#include <complex>
using namespace std;

class Complex
{
private:
    double i;
    complex<double> imaginarypart = i*sqrt(1);
    double realpart;
public:
    void seti(double a1) {
        i = a1;
    }
    void setrealpart(double a2) {
        realpart = a2;
    }
    void printwhole() {
        cout << realpart + imaginarypart;
    }
};

int main()
{
    double a, b;
    cout << "Enter your realpart" << endl;
    cin >> a;
    cout << "Enter your imaginarypart " << endl;
    cin >> b;

    Complex num1;
    num1.seti(b);
    num1.setrealpart(a);
    cout << endl;
    num1.printwhole();
}

关键是 double 类型不能存储虚数值。
但是您尝试这样做,例如与 sqrt(1); (虽然你可能意味着 -1)。
complex<double> 确实能够存储虚数值,但一方面它不会通过将未初始化的 i 的乘积分配给 1 来工作,另一方面你似乎试图自己实现复数。使用提供的复杂标准类型在某种程度上破坏了这一点。如果你使用它,那么你只需要学会以你想要的格式输出它,而不是做所有的实现工作。

假设您更有兴趣先自己完成。
您需要做的是始终将复数表示为两个数字。
因此,我建议像这样更改您的代码。

#include <iostream>
using namespace std;

class Complex
{
private:
    /* double i; Won't work, it cannot store imaginary values. */
    double imaginarypart;
    double realpart;
public:
    void setimaginarypart(double a1) {
        imaginarypart = a1;
    }
    void setrealpart(double a2) {
        realpart = a2;
    }
    void printwhole() {
        cout << realpart << '+' <<  imaginarypart << 'i'; // To get the output you want.
    }
};

int main()
{
    double a, b;
    cout << "Enter your realpart" << endl;
    cin >> a;
    cout << "Enter your imaginarypart " << endl;
    cin >> b;

    Complex num1;
    num1.setimaginarypart(b);
    num1.setrealpart(a);
    cout << endl;
    num1.printwhole();
}

或者使用现有的解决方案(例如 std::complex),而不是尝试自己编写一个。以你想要的形状输出它们 (r+i*I) 不需要你自己实现整个事情。
查看 https://en.cppreference.com/w/cpp/numeric/complex 了解它提供的内容。

如您所知,复数具有实部和虚部。在 std::complex<double> 中,这两个部分合并在一起。

但是在您的 class Complex 中,您有 Complex::iComplex::realpartComplex::imaginarypart::real()Complex::imaginarypart::imag()。那是 4 个部分!

此外,complex<double> imaginarypart = i*sqrt(1);表示在创建Complex对象时将Complex::imaginarypart设置为i*sqrt(1)。但是那个时候,i还没有初始化!所以那也行不通。这就是为什么你得到随机数(或崩溃,取决于你的运气)。

简单的解决方案是放弃整个 class Complexstd::complex<double>已经有设置实部和虚部的函数,即std::complex<double>::real(double)std::complex<double>::imag(double)

(注意:realimag 如果你传递一个值,则为 setter,否则为 getter。