对于分数类型,重载运算符<,==
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于分数类型,重载运算符<,==相关的知识,希望对你有一定的参考价值。
我试图在C ++中重载运算符<。到目前为止,我只设法做+, - ,*,/。我已经提出了这个代码:
Fraction Fraction::operator/(Fraction &second)
int n1 = getNumerator() * second.getDenominator();
int n2 = second.getNumerator() * getDenominator();
int d = getDenominator() * second.getDenominator();
return Fraction(n1/n2, d);
bool Fraction::operator<(Fraction &second)
if(numerator < second.numerator)
return true;
else if(denominator < second.denominator)
return true;
else
return false;
我想知道如何修改它以便我可以重载运算符<,==?我需要一个布尔方法类型,这是我所知道的,但我不知道要比较。提前致谢。
答案
注意:我的原始答案并不完美,并且处理了许多假设,主要是分母不会为零,这可以通过类成员设置器强制执行。 setter也可用于强制分母为正(通过将符号推到分子上)。一旦分母被迫严格大于零,operator<
可以优雅地写成(参见johnchen's answer,其中b * d > 0
):
bool Fraction::operator<(const Fraction &second) const
return getNumerator() * second.getDenominator() < second.getNumerator() * getDenominator();
这里唯一剩下的风险是溢出,如果分子和分母的使用数据类型是int64_t
或更小,可以强制此计算中使用的数据类型为int32_t
以消除此风险。
原始(低质量)接受的答案:
bool Fraction::operator<(const Fraction &second) const
return (float(getNumerator() ) / getDenominator() < float(second.getNumerator() ) / second.getDenominator() )
事实上,你应该有一个const方法getFloatingValue
,它返回float(getNumerator() ) / getDenominator()
:这将简化编写其他比较函数。
另一答案
我不知道要比较
用这个事实
(a / b) < (c / d) ←→ (a * d) < (c * b) if b * d > 0
(a / b) < (c / d) ←→ (a * d) > (c * b) if b * d < 0
(假设没有发生溢出)
另一答案
这很简单。 (一条建议:如果运算符不修改对象,则使用const引用...)
bool Fraction::operator<(const Fraction &that) const
unsigned long long num1 = this->num * that.denom;
unsigned long long num2 = that.num * this->denom;
return num1 < num2;
bool Fraction::operator==(const Fraction &that) const
// I'm too lazy to do more maths, so I cheat
return !(*this < that || that < *this);
请注意,这不会处理已签名的数字(显然),这是作为练习留给您的。
以上是关于对于分数类型,重载运算符<,==的主要内容,如果未能解决你的问题,请参考以下文章