2012-03-28 98 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); 
}