我正在努力解决有关二元比较运算符 > 重载的问题。按照设计,它应该比较两张卡片并返回 1(如果左侧参数更大)或 0(相反的情况)。
这里是问题的简要描述:
class Card
包括变量 int suit
和 int 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/