2012-03-28 63 views
0
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类实现的比较运算符,但它们失败了我的教授给我的测试程序,可能会使用某些方向。问题是什么?为MyString类重载比较运算符

+1

什么是* *问题? – Puppy 2012-03-28 05:16:35

+1

'strcmp'函数可以返回零,_negative_或_positive_。它不具有“-1”或“1”的特征。 – 2012-03-28 05:33:47

+0

很好的答案,但我不认为'operator =='正在做你想做的事情。你在比较指针,而不是数值。试试这个:'return!strcmp(left.value,right.value);' – parkovski 2012-03-28 05:43:43

回答

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); 
} 
+0

我强烈建议使用此解决方案,因为它避免了代码复制。 – Black 2012-03-28 05:59:27

+0

我确实使用过它,它效果很好。另外它非常干净,看起来不错。非常感谢! – 2012-03-28 06:07:05

0

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

0

通常,您只能实施operator==operator<。所有其他关系运营商都可以委托给他们,确保代码重用。我相信在Boost中甚至有一个CRTP mixin可以为你做到这一点。

+0

'简单包括'utility'也​​会让你得到其他操作符:http://en.cppreference.com/w/cpp/utility/rel_ops/ operator_cmp – 2012-03-28 05:23:10

1

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

您可以将代码进一步减少类似:

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