2016-04-25 49 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. 我加了一个会员,所以我有东西要比较