重载MyString类的比较运算符

时间:2012-03-28 05:13:48

标签: c++

bool operator == (const MyString& left, const MyString& right)
{
    if(left.value == right.value)
        return true;
    else return false;
}
bool operator != (const MyString& left, const MyString& right)
{
    if(left == right)
        return false;
    else 
        return true;
}
bool operator < (const MyString& left, const MyString& right)
{
    if(strcmp(left.value, right.value) == -1)
        return true;
    else
        return false;
}
bool operator > (const MyString& left, const MyString& right)
{
    if(strcmp(left.value, right.value) == 1)
        return true;
    else
        return false;
}
bool operator <= (const MyString& left, const MyString& right)
{
    if(strcmp(left.value, right.value) == -1 || strcmp(left.value, right.value) == 0)
        return true;
    else
        return false;
}
bool operator >= (const MyString& left, const MyString& right)
{
    if(strcmp(left.value, right.value) == 1 || strcmp(left.value, right.value) == 0)
        return true;
    else
        return false;
}

这些是我为MyString类实现的比较运算符,但它们无法通过我教授给我的测试程序,并且可以使用某个方向。有什么问题?

4 个答案:

答案 0 :(得分:1)

问题在于strcmp。您可以看到文档here

您可以进一步将代码缩减为:

bool operator < (const MyString& left, const MyString& right) 
{ 
    return (strcmp(left.value, right.value) < 0);
} 

答案 1 :(得分:1)

你可以用两个比较器来表达每个比较器:

bool operator == (const MyString& left, const MyString& right) {
    return strcmp(left.value, right.value) == 0;
}
bool operator < (const MyString& left, const MyString& right) {
    return strcmp(left.value, right.value) < 0;
}

bool operator != (const MyString& left, const MyString& right) {
    return !(left == right);
}
bool operator > (const MyString& left, const MyString& right) {
    return !(left == right) && !(left < right);
}
bool operator <= (const MyString& left, const MyString& right) {
    return left < right || left == right;
}
bool operator >= (const MyString& left, const MyString& right) {
    return !(left < right);
}

答案 2 :(得分:0)

我认为strcmp应该为不平等情况返回一个非零值。因此,您可能希望尝试大于0且小于0的情况,而不是使用1和-1。

答案 3 :(得分:0)

通常,您只需实施operator==operator<。可以将所有其他关系运算符委托给它们,确保代码重用。在Boost中甚至还有一个CRTP mixin可以为你做这个,我相信。