2016-04-25 12 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

おかしい。 * 2つのオブジェクトが等しいかどうかをどのように知っていますか? - - 答え - *等しいので等しくなります。それはあなたのコードが言っていることです。 – PaulMcKenzie

答えて

3

あなたは無限回帰ループを持っています。今度は再びなどの関数を呼び出すif文が含まれてい

if(*this == temp) 

通話bool operator==(opo temp)。これにより、プログラムのリソースが不足し、最終的にスタックオーバーフローやセグメンテーションが発生します。

あなたが同等かどうかを確認するには、メンバーを確認する必要があります。クラスはステートレス(メンバーなし)なので、2つのオブジェクトは等しいはずです。

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) 

これはちょうど再び同じ関数を呼び出すような比較対象を持っているでしょう最終的にはスタックのオーバーフローが発生します。

2つのオブジェクトが同一であるかどうかを確認するために実際の方法を思いつく必要があります。

オペレータの署名は、変わったです。あなたは、右側の引数(a2元のコードで)の一時的なコピーを強制しています。我々は、我々はによってそれを取る一時的なコピー

  • を作成していないという意味、参照することによって右手側の引数を取る

    1. :より多くの通常の実装では、

      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; 
      } 
      

      ノートのようになります。 const参考、私たちはそれを変更しないことを約束します(なぜあなたはそれを比較しながら何かを変更するでしょうか?)

    2. 私たちの演算子にはconstとマークされていますので、 eどちらか
    3. 私はメンバーを追加しましたので、私は何かを比較しました
  • 関連する問題