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

时间:2011-12-02 17:13:46

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

我正在努力解决有关二进制比较运算符重载的问题&gt;。按照设计,它应该比较两张牌并返回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的类型为Card *,并指向类型为Card的有效对象。此外,class Node的实例表示单链表中的节点。

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

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

 /* do wondrous stuff */

  }

此外,隔离后,Card &Node::getCardRef()似乎会产生预期效果。

1 个答案:

答案 0 :(得分:0)

  

“在Card&amp; Node :: getCardRef()中:this = 0x0”)

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

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

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

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

我猜您要将链接列表中的最终项目与不遵循它的空项目进行比较。

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