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

Use of overloaded comparison operator> in C++ in conjunction with a getter function

本文关键字:C++ getter 结合 函数 比较 运算符 重载 gt      更新时间:2023-10-16

我正在努力解决一个关于二进制比较操作符>的重载问题。按照设计,它应该比较两张牌并返回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;
 }

,其中变量cCard *类型,指向Card类型的有效对象。另外,class Node的实例表示单链表中的一个节点。

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

 if (node.getCardRef() > node.getNext()->getCardRef()){   
 /* do wondrous stuff */
  }

同样,当分离时,Card &Node::getCardRef()似乎产生了期望的结果。

"在卡和节点:getCardRef (): = 0 x0")

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

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

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

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

我猜你是在比较链表上的最后一项与不跟随它的空项。


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