我正在努力解决有关二进制比较运算符重载的问题>。按照设计,它应该比较两张牌并返回1(如果左侧参数更大)或0(在相反的情况下)。
以下是该问题的简要说明:
class Card
包括变量int suit
和int value
等私有数据成员。我已经声明了重载的运算符函数如下:
int operator>(const Card& lhs, const Card& rhs);
因为它需要访问class Card
的私有数据成员,所以在类声明中使用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()
似乎会产生预期效果。
答案 0 :(得分:0)
“在Card& Node :: getCardRef()中:this = 0x0”)
if (node.getCardRef() > node.getNext()->getCardRef()){
Node::getCardRef
在该代码片段中被调用两次。第一次作为.
运算符的结果,我们可以合理地确定 * 它的this
是有效的。
对Node::getCardRef
的另一次调用是->
运算符的结果。 ->
的左侧很可能是0(因此,this
也将为0。
很可能node.getNext()
返回0的情况。单链表通常通过返回空指针来指示列表结束条件。
我猜您要将链接列表中的最终项目与不遵循它的空项目进行比较。
<小时/> *:我们可以合理地确定,但不是100%肯定。节点可能包含损坏的引用,或者先前的Wild指针已损坏我们的局部变量。根据我的经验,空指针比空引用更有可能。