尝试将调用对象与另一个对象进行比较时出现分段错误
Segmentation fault when trying to compare calling object with another object
我有以下代码,其中我试图将此对象与另一个对象进行比较。但是当我尝试运行时,它会给出分段错误。 在告诉我要进行哪些更改的同时,还告诉我为什么这会引发分段错误
#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;
}
笔记:
- 我们通过引用获取右侧参数,这意味着我们不会创建临时副本
- 我们通过 const 引用来获取它,这意味着我们承诺不会更改它(为什么您在比较时要更改某些内容?
- 我们的运算符也标记为
const
,所以我们承诺也不会更改左侧 - 我添加了一个成员,所以我有一些东西可以比较
相关文章:
- C++分数混合比较运算符错误
- 在C++中比较来自向量的字符串时出现分段错误
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- 黑客兰克中的错误比较三元组代码
- Qt 错误 iso c++ 禁止指针和整数之间的比较 -permissive
- 为什么Visual Studio没有对逻辑比较错误进行热身?
- qsort 比较函子的分段错误
- std::映射服装比较函数和函数/lambda错误
- 错误:ISO C++禁止在指针和整数 [-fallowive] 之间进行比较
- 错误:运算符 [] 不匹配。在比较列表中的 int 和 int 时<int>,
- 将子字符串与字符串数组进行比较的 IF 条件会在C++中产生错误
- 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误
- 为什么使用 and 运算符比较 if 语句中的 2 个对象会抛出错误,而使用 2 if 语句则不会
- 比较枚举的值会给出编译器错误
- 如何修复C++中的"指针和整数之间的比较"错误?
- TBB免费图像lambda阵列比较错误
- C++,指向整数比较错误的指针
- 字符比较错误
- GUID比较错误