c++ - 在 C++ 中结合 getter 函数使用重载的比较运算符>

标签 c++ operator-overloading comparison-operators return-by-reference

我正在努力解决有关二元比较运算符 > 重载的问题。按照设计,它应该比较两张卡片并返回 1(如果左侧参数更大)或 0(相反的情况)。

这里是问题的简要描述:

class Card 包括变量 int suitint value 作为私有(private)数据成员。我已将重载运算符函数声明如下:

int operator>(const Card& lhs, const Card& rhs);

因为它需要访问类Card的私有(private)数据成员,所以在类声明中用friend限定符声明。

函数本身已确认按描述工作。真正的问题在于通过调用以下形式的“getter”函数来提供两个参数:

 Card &Node::getCardRef() const{
       Card& ref = *c;
       return ref;
 }

其中变量 c 的类型为 Card * 并指向类型为 Card 的有效对象。此外,class Node 的实例表示单向链表中的节点。

以下列方式组合这两个函数会导致段错误(具体来说,在 gdb 术语中“In Card &Node::getCardRef(): this = 0x0”):

 if (node.getCardRef() > node.getNext()->getCardRef()){   

 /* do wondrous stuff */

  }

此外,当被隔离时,Card &Node::getCardRef() 似乎会产生预期的结果。

最佳答案

"In Card &Node::getCardRef(): this = 0x0")

if (node.getCardRef() > node.getNext()->getCardRef()){   

Node::getCardRef 在该代码片段中被调用了两次。第一次作为 . 运算符的结果,所以我们可以合理地确定* 它的 this 是有效的。

Node::getCardRef 的另一个调用是 -> 运算符的结果。 -> 的左侧很可能是 0(因此,this 也将是 0)。

很有可能 node.getNext() 返回 0。单向链表通常通过返回空指针来指示列表结束条件。

我猜您是在将链接列表中的最后一项与不跟在它后面的空项进行比较。


*:我们可以合理地确定,但不是 100% 确定。节点可能包含损坏的引用,或者先前的野指针损坏了我们的局部变量。根据我的经验,空指针比空引用更有可能。

关于c++ - 在 C++ 中结合 getter 函数使用重载的比较运算符>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8360041/

相关文章:

c++ - 混合模板化参数类型

python - python 运算符优先级如何与双重比较一起使用?

python - 为什么 "not(True) in [False, True]"返回 False?

c++ - Lua 比 C/C++ 更适合的示例用法

c++ - 如何在 C++ 中为数组重载运算符<<?

c++ - 无法找出以下程序中的运行时错误

c++ - 三向比较运算符成员与非成员实现

c++ - C++模板泛型(模板参数列表)

C++ 创建模板 T 对象的拷贝

c++ - 无法从类型 'Class::operator==' bool 转换为 'bool (Class::)(Class*) to type '