【问题标题】:Overloading <= operator but program ends with exit code -1073741571 (0xC00000FD)重载 <= 运算符但程序以退出代码 -1073741571 (0xC00000FD) 结束
【发布时间】:2019-11-17 16:54:13
【问题描述】:

我正在尝试重载

进程以退出代码 -1073741571 (0xC00000FD) 结束

op.h

bool operator<=(const Date& d1, const Date& d2)
{
    return d1 <= d2;
}

main.cpp

cout << "Checking <=" << endl;
assert(Date(1,1,2000) <= Date(2,1,2000));
assert(!(Date(2,1,2000) <= Date(1,1,2000)));
assert(Date(2,1,2000) <= Date(1,2,2000));
assert(Date(2,2,2000) <= Date(1,1,2001));
cout << "Checking <= Complete!" << endl;

这里发生了什么?

【问题讨论】:

  • 无限递归导致堆栈溢出您的operator&lt;=(const Date&amp; d1, const Date&amp; d2) 在其主体中调用operator&lt;=(const Date&amp; d1, const Date&amp; d2)
  • 您需要将Date 小于/等于另一个的条件实际放入运算符重载中。编译器并不神奇地知道这些是什么,正如其他人所解释的那样,您现在编写它的方式只会导致无限递归。
  • 我正在尝试重载 -- 为什么要专门使用那个运算符?在 C++ 中,几乎事实上重载的两个运算符是 ==&lt;。所有其他关系运算符&lt;=&gt;&gt;=!=,都可以派生自==&lt;。所以我的建议是重载&lt;==,然后你几乎可以“免费”获得所有其他运算符。
  • 更准确地说,如果你有a &lt; b,那么a &gt;= b就是!(a &lt; b)。编写&lt; 的函数,然后&gt;= 的函数就是return !(a &lt; b);。同样,a &lt;= b(您正在尝试实现)是return !(b &lt; a);

标签: c++ c++11 operator-overloading


【解决方案1】:

在你的情况下,你打电话给

bool operator<=(const Date& d1, const Date& d2)

无限期地,最终出栈,因为它是一个递归调用。 尝试直接比较作为参数传递的两个对象的内容。

【讨论】:

  • @uneven_mark 确实,我是个白痴。我已经编辑了答案。
  • 你能给我举个例子吗?我仍在努力解决运算符重载问题。
  • @Leon185 你能告诉我你上课的内容吗? (日期)
猜你喜欢
  • 2022-11-17
  • 1970-01-01
  • 2014-01-04
  • 2020-10-14
  • 1970-01-01
  • 2023-01-17
  • 2021-08-18
  • 2020-12-06
  • 1970-01-01
相关资源
最近更新 更多