个人构造的复数类的问题
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的引用)并以:
返回*这个;
无论如何,为什么编译器在函数没有返回值时不警告您?您是否将警告级别设置为"从不警告我"?打开编译器警告。当函数声明为具有结果时不返回值是一个基本错误,它甚至不应该只是一个警告。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题