c++ - 如何在声明期间将操作分配给复数?
问题描述
我正在为复数编写一个类,当我声明其中一个时,我必须在我可以为其分配操作之前且仅在之后声明它。
例如:
这有效:
ComplexNumber Number;
Number = AnotherComplex + (or -) AgainAnotherComplex;
这不起作用:
ComplexNumber Number = AnotherComplex + (or -) AgainAnotherComplex;
我留下的是 .h 文件:
#ifndef COMPLEX_NUMBERS_H_INCLUDED
#define COMPLEX_NUMBERS_H_INCLUDED
#include <iostream> // for std namespace
class ComplexNumber
{
public:
ComplexNumber();
ComplexNumber(float RealPart, float ImaginaryPart);
ComplexNumber(ComplexNumber &NewComplexNumber);
~ComplexNumber();
void SetRealPart(float RealPart);
void SetImaginaryPart(float ImaginaryPart);
friend ComplexNumber operator+(const ComplexNumber Complex1, const ComplexNumber Complex2);
friend ComplexNumber operator-(const ComplexNumber Complex1, const ComplexNumber Complex2);
friend std::ostream & operator<<(std::ostream &output, const ComplexNumber &NumberToDsiplay);
friend std::istream & operator >>(std::istream &input, ComplexNumber &NumberToInput);
bool operator==(const ComplexNumber Complex);
bool operator!=(const ComplexNumber Complex);
private:
float RealPart;
float ImaginaryPart;
};
#endif // COMPLEX_NUMBERS_H_INCLUDED
我还把 .cpp 文件留在这里:
#include "Complex Numbers.h"
ComplexNumber::ComplexNumber()
{
RealPart = 0;
ImaginaryPart = 0;
}
ComplexNumber::ComplexNumber(float RealPart, float ImaginaryPart)
{
SetRealPart(RealPart);
SetImaginaryPart(ImaginaryPart);
}
ComplexNumber::~ComplexNumber()
{
}
ComplexNumber::ComplexNumber(ComplexNumber &NewComplexNumber)
{
RealPart = NewComplexNumber.RealPart;
ImaginaryPart = NewComplexNumber.ImaginaryPart;
}
void ComplexNumber::SetRealPart(float RealPart)
{
this->RealPart=RealPart;
}
void ComplexNumber::SetImaginaryPart(float ImaginaryPart)
{
this->ImaginaryPart=ImaginaryPart;
}
ComplexNumber operator+(const ComplexNumber Complex1, const ComplexNumber Complex2)
{
ComplexNumber TemporaryComplexNumber;
TemporaryComplexNumber.RealPart = Complex1.RealPart + Complex2.RealPart;
TemporaryComplexNumber.ImaginaryPart = Complex1.ImaginaryPart + Complex2.ImaginaryPart;
return TemporaryComplexNumber;
}
ComplexNumber operator-(const ComplexNumber Complex1, const ComplexNumber Complex2)
{
ComplexNumber TemporaryComplexNumber;
TemporaryComplexNumber.RealPart = Complex1.RealPart - Complex2.RealPart;
TemporaryComplexNumber.ImaginaryPart = Complex1.ImaginaryPart - Complex2.ImaginaryPart;
return TemporaryComplexNumber;
}
std::ostream & operator<<(std::ostream &output, const ComplexNumber &NumberToDsiplay)
{
if(NumberToDsiplay.ImaginaryPart > 0)
output << std::endl << NumberToDsiplay.RealPart << "+" << NumberToDsiplay.ImaginaryPart << "i";
else if(NumberToDsiplay.ImaginaryPart < 0)
output << std::endl << NumberToDsiplay.RealPart << "" << NumberToDsiplay.ImaginaryPart << "i";
else if(NumberToDsiplay.ImaginaryPart == 0)
output << std::endl << NumberToDsiplay.RealPart << " (The imaginary part is equal to 0)";
return output;
}
std::istream & operator >>(std::istream &input, ComplexNumber &NumberToInput)
{
std::cout << "Enter the real part: ";
input >> NumberToInput.RealPart;
std::cout << "Enter the imaginary part: ";
input >> NumberToInput.ImaginaryPart;
}
bool ComplexNumber::operator==(const ComplexNumber Complex)
{
return RealPart==Complex.RealPart && ImaginaryPart==Complex.ImaginaryPart;
}
bool ComplexNumber::operator!=(const ComplexNumber Complex)
{
if(RealPart != Complex.RealPart && ImaginaryPart != Complex.ImaginaryPart)
return true;
else if(RealPart != Complex.RealPart && (!(ImaginaryPart != Complex.ImaginaryPart)))
return true;
else if(ImaginaryPart != Complex.ImaginaryPart && (!(RealPart != Complex.RealPart)))
return true;
return false;
}
解决方案
只需声明复制构造函数
ComplexNumber( const ComplexNumber &NewComplexNumber);
^^^^^
否则,编译器无法将非常量引用绑定到作为表达式结果的临时引用
AnotherComplex + (or -) AgainAnotherComplex
调用任一运算符
friend ComplexNumber operator+(const ComplexNumber Complex1, const ComplexNumber Complex2);
friend ComplexNumber operator-(const ComplexNumber Complex1, const ComplexNumber Complex2);
反过来应该声明为
friend ComplexNumber operator+(const ComplexNumber &Complex1, const ComplexNumber &Complex2);
friend ComplexNumber operator-(const ComplexNumber &Complex1, const ComplexNumber &Complex2);
那就是参数应该是引用类型。
而这个运算符定义
bool ComplexNumber::operator!=(const ComplexNumber Complex)
{
if(RealPart != Complex.RealPart && ImaginaryPart != Complex.ImaginaryPart)
return true;
else if(RealPart != Complex.RealPart && (!(ImaginaryPart != Complex.ImaginaryPart)))
return true;
else if(ImaginaryPart != Complex.ImaginaryPart && (!(RealPart != Complex.RealPart)))
return true;
return false;
}
没有多大意义。
像这样定义
bool ComplexNumber::operator!=(const ComplexNumber &Complex) const
{
return not( *this == Complex );
}
注意const
参数列表后面的限定符。您需要添加到operator ==
.
推荐阅读
- python-3.x - 为什么 pygame 不能使用 font.Sysfont() 渲染 unicode,而 font.font() 可以使用复制到应用程序文件夹中的 ttf 文件来完成这项工作
- node.js - 在我的网络聊天应用程序中显示为已弃用的变量
- javascript - 赛普拉斯:使用 cy.intercept() 检查是否还没有进行呼叫?
- python - 根据不同的参数在Python pandas中计算多个月的字段
- kotlin - 无法使用 picocli 和 micronaut 连接数据库
- python - 如何查找某个范围内的所有像素值
- python - checkpoint.restore() 如何在 Tensorflow 中工作,注意神经机器翻译
- r - 是否有记录 CPU 使用率的 R 函数?
- javascript - 在滚动时反应工具提示触发 componentDidupdate
- flutter - 无法执行 HTTP 请求,没有与主机名关联的地址