我有以下代码,其中我试图将此对象与另一个对象进行比较。但是当我尝试运行它时会给出分段错误。虽然告诉我要做出哪些更改,但也告诉我为什么会抛出分段错误
#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 :(得分: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;
}
注意:
const
,因此我们承诺不会改变左侧