1

我正在尝试在 C++ 中重载 operator<。到目前为止,我只设法做到了+、-、*、/。我得到了这段代码:

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;
}

}

我想知道我应该如何修改它以便我可以重载运算符 <, == ?我需要一个我知道但我不知道比较的布尔方法类型。提前致谢。

4

3 回答 3

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

(假设没有发生溢出)

于 2013-07-12T10:12:38.033 回答
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);
}

请注意,这不涉及带符号的数字(显然),这留给您作为练习。

于 2013-07-12T10:14:10.647 回答
-2

注意:我最初的答案并不完美,并且处理了许多假设,主要是分母不会为零,这可以通过类成员设置器强制执行。setter 还可用于强制分母为正(通过将符号推到分子)。一旦分母被强制严格大于零,operator<就可以优雅地写成(参见johnchen 的回答,其中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(): 这将简化编写其他比较函数的过程。

于 2013-07-12T10:12:47.343 回答