我有以下代码,我需要添加两个复数。公式正在运作,但是,我无法摆脱科学记数法。我是C ++的新手,不知道如何使用setPrecision。
我的代码在.hpp:
class ComplexNumber
{
public:
//--constructors
ComplexNumber();
ComplexNumber(double r, double i);
ComplexNumber(const ComplexNumber &cn);
void print();
ComplexNumber add(const ComplexNumber &rhs);
private:
double re, im;
};
我在.cpp文件中的代码
//--constructors
ComplexNumber::ComplexNumber()
{
}
ComplexNumber::ComplexNumber(double r, double i)
{
}
ComplexNumber::ComplexNumber(const ComplexNumber &cn)
{
}
void ComplexNumber::print()
{
std::cout << this->re << " + " << this->im << "i" << std::endl;
}
ComplexNumber ComplexNumber::add(const ComplexNumber &rhs)
{
return ComplexNumber(this-> re + rhs.re, this->im + rhs.im);
}
我的主要人物:
int main(int argc, const char * argv[]) {
ComplexNumber a(1,2);
ComplexNumber b(3,4);
ComplexNumber c;
c = a.add(b);
c.print();
return 0;
}
输出: 4.94066e-324 + 6.95322e-310i
它应该是4 + 6i
答案 0 :(得分:2)
你的构造函数实际上都没有做任何东西。这意味着成员变量将是未初始化的,它们的值将是不确定的,使用它们将导致未定义的行为
您需要实际初始化构造函数中的成员。
答案 1 :(得分:2)
在修复语法(使其成为聚合)后按预期工作:
#include <iostream>
struct ComplexNumber
{
void print();
ComplexNumber add(const ComplexNumber &rhs);
double re, im;
};
void ComplexNumber::print()
{
std::cout << this->re << " + " << this->im << "i" << std::endl;
}
ComplexNumber ComplexNumber::add(const ComplexNumber &rhs)
{
return ComplexNumber{this-> re + rhs.re, this->im + rhs.im};
}
int main(int argc, const char * argv[]) {
ComplexNumber a{1,2};
ComplexNumber b{3,4};
ComplexNumber c;
c = a.add(b);
c.print();
return 0;
}
答案 2 :(得分:1)
精确度
这个问题。您的双参数构造函数需要按如下方式实现
ComplexNumber::ComplexNumber(double r, double i) : re(r), im(i)
{
}
否则,班级成员未初始化。
读取未初始化的变量是C ++中未定义的行为;你的输出就是一种表现形式。
在风格上可以接受(在我看来,首选为数字级别)
ComplexNumber() = default;
用于默认构造函数;如果你希望它保持类成员未初始化,就像C ++内置类型的情况一样。在将成员变量分配给某些变量之前,不要读取成员变量。
最后,依靠编译器为你生成复制构造函数:没有必要自己构建。