2

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

以下是问题的简要说明:

class Card除其他外,还包括变量int suitint value私有数据成员。我已将重载的运算符函数声明如下:

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

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

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

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

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

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

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

 /* do wondrous stuff */

  }

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

4

1 回答 1

0

"在卡 &Node::getCardRef(): this = 0x0")

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

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

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

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

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


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

于 2011-12-02T19:59:30.003 回答