过载运算符< ,==对于分数类型

时间:2013-07-12 10:08:17

标签: c++ operator-overloading

我正在尝试重载运算符<在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 ;, ==?我需要一个布尔方法类型,这是我所知道的,但我不知道要比较。提前谢谢。

3 个答案:

答案 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():这将简化其他比较函数的编写。