2016-04-25 52 views
0

我有以下代碼,其中我試圖比較此對象與另一個對象。但是,當我嘗試運行它給分段錯誤。在告訴我要做什麼改變的同時,告訴我爲什麼會引發分段錯誤嘗試比較調用對象與另一個對象時的分段錯誤

#include<iostream> 
using namespace std; 
class opo 
{ 
    public: 
    bool operator==(opo temp); 
}; 
bool opo::operator==(opo temp) 
{ 
    if(*this == temp) 
    { 
     cout<<"same\n"; 
     return true; 
    } 
    else 
    { 
     cout<<"diff\n"; 
     return false; 
    } 
} 

int main() 
{ 
    opo a1,a2; 
    a1==a2; 
    return 0; 
} 
+0

好笑。 *你怎麼知道兩個對象是否相等?* - 答案 - *它們是平等的,因爲它們是相等的*。這就是你的代碼所說的。 – PaulMcKenzie

回答

3

您有一個無限遞歸循環。

if(*this == temp) 

調用bool operator==(opo temp)包含if語句,這反過來又等調用該函數。這會導致程序資源耗盡,最終導致堆棧溢出或段錯誤。

當你平等的時候,你需要檢查成員。既然你的課是無國籍的(沒有成員),任何兩個對象應該是平等的。

如果你有類成員一樣

class Foo 
{ 
public: 
    int a, b; 
}; 

那麼我們將不得不像

bool Foo::operator ==(const Foo & rhs) 
{ 
    return a == rhs.a && b == rhs.b; 
    // or with std::tie 
    return std::tie(a, b) == std::tie(rhs.a, rhs.b); 
} 
3
bool opo::operator==(opo temp) 
{ 
    if(*this == temp) // calls this->operator==(temp) 

這只是再次調用相同功能的比較對象,從而導致無限遞歸併最終導致堆棧溢出。

您需要想出一些實際的方法來判斷兩個對象是否相同,然後執行該操作。

另外,您的操作員的簽名是很奇怪。您正在強制使用右側參數的臨時副本(原始代碼中爲a2)。一個比較正常的實現可能看起來像

struct opo { 
    int m_value = 0; 
    bool operator== (opo const &) const; 
}; 

bool opo::operator==(opo const &other) const { 
    // actually compare something 
    return m_value == other.m_value; 
} 

注:

  1. 我們把右手邊的參數作爲參考,這意味着我們不創建一個臨時副本
  2. 我們把它用const參考,這意味着我們承諾不會改變它(爲什麼你會在比較它時改變一些東西?)
  3. 我們的運營商也被標記爲const,所以我們承諾不會改變左邊的sid e
  4. 我加了一個會員,所以我有東西要比較