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

注:私の最初の答えは完璧ではなく、多くの仮定に対処していました。ほとんどの場合、分母はゼロにならず、クラスメンバーのセッターを介して強制できます。セッターを使用して、分母を強制的に正にすることもできます (符号を分子にプッシュすることによって)。分母が厳密にゼロより大きくなるように強制されると、次の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() )
}

getFloatingValue実際、 :を返すconst メソッドがあれば、float(getNumerator() ) / getDenominator()他の比較関数を簡単に記述できるはずです。

于 2013-07-12T10:12:47.343 に答える