2012-07-17 192 views
-1

這裏是我的邏輯比較運算符(==)重載的代碼。我用它來檢查兩個字符串的大小和內容是否相同。否則它應該返回false。邏輯比較運算符

bool MyString::operator==(const MyString& other)const 
{ 
    if(other.Size == this->Size) 
    { 
     for(int i = 0; i < this->Size+1; i++) 
     { 
      if(&other == this)       
        return true;    
     } 
    } 
    else 
     return false; 
} 

當我跑valgrind它告訴我警告控制達到非無效功能的結束。關於如何解決這個問題的任何建議,以及我能做些什麼來改善代碼?

+3

的循環似乎沒有比較對象的內容,只是重複地檢查,如果地址'other'和'this'是相同。 – hmjd 2012-07-17 14:31:51

+0

嗯我甚至沒有意識到,謝謝。大小比較至少正確嗎?我對此有點不安。 – user1363061 2012-07-17 14:33:40

+0

可能不是。如果你有一個等於'char s [Size]的數組,那麼它是不正確的,因爲數組索引從0開始,這意味着最後一個有效索引是'Size - 1'。 – hmjd 2012-07-17 14:34:52

回答

3

當控制到達for循環的末尾時,您立即到達函數的結尾而不返回值。

它在我看來像你的for循環中的邏輯消失了 - 它將其他項目的地址與此相比較。雖然這樣做可以,但你只需要做一次,而不是循環。

在循環中,您無疑需要比較字符串中的字符,而不是對象的地址。

編輯:

典型的實現將是這東西一般順序:

class MyString { 
    char *data; 
    size_t length; 
public: 
    // ... 
    bool operator==(MyString const &other) const { 
     if (length != other.length) 
      return false; 
     for (int i=0; i<length; i++) 
      if (data[i] != other.data[i]) // If we see any inequality 
       return false;    //  they're not equal 
     return true;      // all equal, so the strings are equal. 
    } 
}; 
+0

是的,這正是我想要做的。唯一的問題是我不確定如何以最簡單的方式做到這一點。 – user1363061 2012-07-17 14:37:20

+0

謝謝你!很有道理! – user1363061 2012-07-17 17:21:04

0

剛剛擺脫了else的。如果條件不滿足,這種方式會返回false的「默認」行爲。這是你想要的功能,編譯器或語法檢查器不會抱怨。

1

這不是太清楚是什麼因素決定的平等,如果大小相等,但 環路建議您正在尋找的東西,如:

bool 
MyString::operator==(MyString const& other) const 
{ 
    return size == other.size && std::equals(???); 
} 
1

嗯,首先,如果你進入for循環,並且條件&other == this將不會被滿足,你將永遠不會返回任何東西。要解決這個問題,你應該刪除else語句。如果other.Size == this->Size條件未滿足,或者您已經完成了整個循環,並且沒有在其中使用return,這將導致函數返回false。

第二個問題是行if(&other == this)。我相信在循環內部你打算檢查字符串的所有符號。但是現在你只是檢查指向類本身的指針。要檢查字符,您需要使用類似if(other->data == this->data)的東西,前提是您有一個data成員,用於存儲......數據(對於重言式而言爲抱歉)。

另一個小流量是在設計中。你看,要檢查字符串是否等於,則需要查看每個字符並檢查它們是否匹配。但是,要證明字符串是而不是等於,則需要找到只有1對不匹配的字符。之後,繼續比較是沒有意義的。因此,最好將週期中的狀態改爲負值,以便在你找到一對不匹配的對之後立即停止比較,而不是對其他字符進行無用的比較。

通常,儘可能快地返回所有錯誤並避免不必要的合計是一種很好的做法。所以如果你可以通過一個簡單的檢查來檢查你的函數的開始,那麼最好這樣做。

所以,畢竟,你應該有這樣的事情:

bool MyString::operator==(const MyString& other)const 
{ 
    if(other.Size != this->Size) 
     return false;//If the sizes do not match, no need to check anything else. Just return false. 

    //If we are here, the sizes match. Lets check the characters. 
    for(int i = 0; i < this->Size+1; i++) 
    { 
     //If some pair doesnt match, the strings are not equal, and we exit. 
     if(other->data[i] != this->data[i])       
        return false; 
    } 

    //If we are here, all the characters did match, so we return true. 
    return true; 
} 
+0

非常感謝你!我猜測數據必須以某種方式分配。 – user1363061 2012-07-17 15:58:46