0

本当に疲れているのかわかりませんが、このコードは、単体テストの実行中に (ロジック?) 問題を引き起こしています。次のコードに何か問題がありますか?

bool Date::operator <= (const Date& d) const {
    if (this != &d) {         
        if (day > d.day)
            return false;
        if (hour > d.hour)
            return false;
        if (minute > d.minute)
            return false;
        if (second > d.second)
            return false;
    }

    return true;
}

テストのためだけに、この(醜い)バージョンに置き換えたところ、すべてのテストに合格しました...

bool Date::operator <= (const Date& d) const {
    if (this != &d) {
        long a = (86400 * day) + (3600 * hour) + (60 * minute) + second;
        long b = (86400 * d.day) + (3600 * d.hour) + (60 * d.minute) + d.second;

        return a <= b;
    }

    return true;
}

誰でも助けることができますか?ありがとう!

4

2 に答える 2

5

と またはのいずれかstd::tieを実装するために利用できる辞書式の比較を利用してから、他の 2 つの観点から実装します。bool operator<bool operator==bool operator>bool operator<=

#include <tuple>

....

bool Date::operator<(const Date& rhs) const
{
    return std::tie(day, hour, minute, second) < 
           std::tie(rhs.day, rhs.hour, rhs.minute, rhs.second);
}

等々。または、同じ方法でbool operator<=直接実装することもできます。std::tie

于 2013-07-09T04:32:41.947 に答える
4

That cannot work. For example, if day < d.day but hour > d.hour, you'll return false, which is incorrect.

What you want is this:

bool Date::operator <= (const Date& d) const {
    if (this != &d) {
        if (day < d.day)
            return true;
        if (day > d.day)
            return false;
        if (hour < d.hour)
            return true;
        if (hour > d.hour)
            return false;
        if (minute < d.minute)
            return true;
        if (minute > d.minute)
            return false;
        if (second > d.second)
            return false;
    }
    return true;
}
于 2013-07-09T03:29:33.420 に答える