个人构造的复数类的问题

Problems with personally constructed complex number class

本文关键字:问题      更新时间:2023-10-16

我很难弄清楚为什么我的复数类没有正确添加或完全按照我想要的方式工作。当我将两个复数加在一起时,我得到了一些非常奇怪的东西,这是不应该的。我一直试图弄清楚出了什么问题,但无法完全弄清楚。我需要保留结构,因为我将把它用于另一个目的。

#include <iostream>
#include <cmath>
using namespace std;
class ComplexNumber{
private:
    double real, imag;
public:
    ComplexNumber(double i,double j){
    real = i;
    imag = j;}
    ComplexNumber add(ComplexNumber c){
    real += c.real;
    imag += c.imag;
    }
    ComplexNumber squared(){
    real = (pow(real,2) - pow(imag,2));
    imag = 2*real*imag;
    }
    double abs() {
    return sqrt(real*real + imag*imag);
    }
    void print(){
        char sign = (imag<0) ? '-' : '+';
        cout<<real<<" "<<sign<<" "<<(imag>0 ? imag : -imag)<<'i'<<endl;
    }
};
int main() {
ComplexNumber c1(3,4), c2(1,1);
ComplexNumber c3=c1.add(c2);
c3.print();
return 0;
}

您的add成员函数承诺返回ComplexNumber但事实并非如此。然后尝试使用返回值,调用未定义的行为squared同样被打破。

您需要弄清楚add是要实现运算符+=的行为还是+。在第一种情况下,您需要返回对正在修改的对象的引用:

ComplexNumber& add(ComplexNumber c)
{//          ^
  real += c.real;
  imag += c.imag;
  return *this;
}

在第二种情况下,不要修改对象,而是创建一个新对象并返回它:

ComplexNumber add(ComplexNumber c)
{
  return Complex(real + c.real, imag + c.imag);
}

请注意,在这种情况下,改用非成员函数可能是有意义的。

我建议查看std::complex以获取良好实现的示例。

如前所述,Add 函数应以以下内容结尾:
返回复数(实数,图像);

但这让我感到疑惑 - 这听起来不像"添加到",听起来像是"添加参数和这个数字并返回一个新的复合体"。 您可以稍微澄清一下您的界面。如果"添加"表示"添加到",那么它可能无效并且不返回任何内容。或者它可能会返回自身,因此您可以在添加到其中后对其进行更多操作。(这就是"+="的作用。如果这是你要找的,你会返回ComplexNumber&(对ComplexNumber的引用)并以:
返回*这个;

无论如何,为什么编译器在函数没有返回值时不警告您?您是否将警告级别设置为"从不警告我"?打开编译器警告。当函数声明为具有结果时不返回值是一个基本错误,它甚至不应该只是一个警告。