2

二項比較演算子 > のオーバーロードに関する問題に苦しんでいます。設計上、2 枚のカードを比較して 1 (左側の引数が大きい場合) または 0 (反対の場合) を返すことになっています。

問題の簡単な説明は次のとおりです。

class Cardとりわけ、変数int suitint valueプライベート データ メンバーが含まれます。オーバーロードされた演算子関数を次のように宣言しました。

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

のプライベート データ メンバーにアクセスする必要があるため、クラス宣言class Cardfriend修飾子を使用して宣言されます。

機能自体は記載通りの動作を確認しております。本当の問題は、次の形式の「getter」関数を呼び出して 2 つの引数を提供することにあります。

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

ここで、変数cは型であり、型Card *の有効なオブジェクトを指しますCard。また、 のインスタンスはclass Node、片方向リストのノードを表します。

次の方法で 2 つの関数を組み合わせると、segfault が発生します (具体的には、gdb 用語で「In Card &Node::getCardRef(): this = 0x0」)。

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

 /* do wondrous stuff */

  }

また、分離Card &Node::getCardRef()すると、望ましい結果が得られるようです。

4

1 に答える 1

0

"In Card &Node::getCardRef(): this = 0x0")

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

Node::getCardRefは、そのコード フラグメントで 2 回呼び出されます。.演算子の結果として初めてなので、それが有効であることを合理的に確信することができますthis

もう 1 つの呼び出しは、演算子Node::getCardRefの結果です。->の左側->が 0 である可能性は十分にあります (したがって、これthisも 0 になります)。

node.getNext()0 を返す可能性が非常に高いです。単一リンク リストは、通常、null ポインタを返すことによってリストの終了条件を示します。

リンクされたリストの最後のアイテムと、それに続かないnullアイテムを比較していると思います。


*: 合理的に確信できますが、100% 確実ではありません。ノードに破損した参照が含まれているか、以前のワイルド ポインターがローカル変数を破損している可能性があります。私の経験では、null ポインターは null 参照よりもはるかに可能性が高いです。

于 2011-12-02T19:59:30.003 に答える