尝试将调用对象与另一个对象进行比较时出现分段错误

时间:2016-04-25 15:03:19

标签: c++ operator-overloading

我有以下代码,其中我试图将此对象与另一个对象进行比较。但是当我尝试运行它时会给出分段错误。虽然告诉我要做出哪些更改,但也告诉我为什么会抛出分段错误

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

2 个答案:

答案 0 :(得分:3)

你有一个无限的递归循环。

if(*this == temp)

调用bool operator==(opo temp),其中包含if语句,而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);
}

答案 1 :(得分: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,因此我们承诺不会改变左侧
  4. 我添加了一名成员,所以我有比较的东西