我正在尝试重载运算符<在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;
}
}
我想知道如何修改它以便我可以重载运算符&lt ;, ==?我需要一个布尔方法类型,这是我所知道的,但我不知道要比较。提前谢谢。
答案 0 :(得分:4)
我不知道要比较
使用
这一事实(a / b) < (c / d) ←→ (a * d) < (c * b) if b * d > 0
(a / b) < (c / d) ←→ (a * d) > (c * b) if b * d < 0
(假设没有发生溢出)
答案 1 :(得分:3)
这很简单。 (一条建议:如果运算符不修改对象,则使用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);
}
请注意,这不会处理已签名的号码(显然),这是留给你的。
答案 2 :(得分:-2)
注意:我的原始答案并不完美,并且处理了许多假设,主要是分母不会为零,这可以通过类成员设置器强制执行。 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()
:这将简化其他比较函数的编写。