【问题标题】:Use of overloaded comparison operator> in C++ in conjunction with a getter function在 C++ 中使用重载比较运算符 > 与 getter 函数
【发布时间】:2012-01-11 16:50:17
【问题描述】:

我正在努力解决有关二元比较运算符 > 重载的问题。按照设计,它应该比较两张卡片并返回 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 &Node::getCardRef(): this = 0x0”):

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

 /* do wondrous stuff */

  }

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

【问题讨论】:

  • getNext() 不返回 NULL 吗?
  • c 指向的对象驻留在堆栈还是freestore?如果它驻留在堆栈上,那么您将返回对导致未定义行为的局部变量的引用。
  • 通常,定义operator> 返回bool
  • 你确定 getNext() 返回一个有效的指针/对象/引用
  • @elmov:你确定吗?错误消息this = 0x0 看起来像是指向我的 NULL 指针。

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


【解决方案1】:

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

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

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

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

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

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


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

【讨论】:

  • 好的,我刚刚注意到整个评论字符串得出的结论和我一样。作为 CW,我将把这个答案留在这里,所以我不会得到任何不应有的功劳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
相关资源
最近更新 更多