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

Segmentation fault when trying to compare calling object with another object

本文关键字:比较 错误 分段 一个对象 调用 对象      更新时间:2023-10-16

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

#include<iostream>
using namespace std;
class opo
{
    public:
    bool operator==(opo temp);
};
bool opo::operator==(opo temp)
{
    if(*this == temp)
    {
        cout<<"samen";
        return true;
    }
    else
    {
        cout<<"diffn";
        return false;
    }
}
int main()
{
    opo a1,a2;
    a1==a2;
    return 0;
}

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

if(*this == temp)
调用包含 if 语句的 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);
}
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. 我添加了一个成员,所以我有一些东西可以比较