Использование перегруженного оператора сравнения> в C ++ в сочетании с функцией получения - PullRequest
2 голосов
/ 02 декабря 2011

У меня проблема с перегрузкой бинарного оператора сравнения>. По замыслу предполагается, что две карты сравниваются и возвращают либо 1 (если левый аргумент больше), либо 0 (в противоположном случае).

Вот краткое описание проблемы:

class Card включает, помимо прочего, переменные int suit и int 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 представляет узел в односвязном списке.

Объединение этих двух функций следующим образом приводит к segfault (в частности, в терминах GDB "In Card & Node :: getCardRef (): this = 0x0"):

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

 /* do wondrous stuff */

  }

Кроме того, Card &Node::getCardRef(), похоже, дает желаемые результаты.

1 Ответ

0 голосов
/ 02 декабря 2011

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

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

Node::getCardRef вызывается дважды в этом фрагменте кода. Первый раз в результате действия оператора ., поэтому мы можем быть достаточно уверены, *, что его this будет действительным.

Другой вызов Node::getCardRef является результатом оператора ->. Вполне вероятно, что левая часть -> равна 0 (таким образом, this также будет 0).

Весьма вероятно, что node.getNext() возвращает 0. Односвязные списки обычно указывают условие конца списка, возвращая нулевой указатель.

Полагаю, вы сравниваете последний элемент в вашем связанном списке с нулевым элементом, который за ним не следует.

<ч /> *: мы можем быть достаточно уверены, но не уверены на 100%. Возможно, узел содержит поврежденную ссылку или предыдущий дикий указатель повредил наши локальные переменные. По моему опыту, нулевые указатели гораздо чаще, чем нулевые ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...