Я пытаюсь использовать шаблон нулевого объекта в двусвязном списке в c ++, но я не могу найти способ использовать его, сохраняя код чистым.
Проблема заключается в следующем фрагменте кода:
node->getNext()->setPrevious(node->getPrevious());
node->getPrevious()->setNext(node->getNext());
getNext
а также getPrevious
вернет NullNode
объект, если следующий / предыдущий узел nullptr
,
Случай использования, когда это не удается — когда узел является головным узлом:
Следующее установит предыдущий указатель 2-го узла на объект NullNode, вызывающий утечку памяти.
node->getNext()->setPrevious(node->getPrevious());
То, что я пытаюсь сделать здесь, это сохранить NOP и сохранить код в чистоте от nullptr
и сравнение типов классов,
Любые предложения будут очень благодарны!
Все будет проще, если вы сохраните узел предыдущий и следующий, что-то вроде этого:
Node* Detach( Node* node) {
auto prev = node->getPrevious();
auto next = node->getNext();
prev->setNext( next );
next->setPrevious( prev);
node->setNext( nullNodeAddr);
node->setPrevious( nullNodeAddr);
return node;
}
Шаблон NOP или Sentinel — это способ упростить операции, чтобы никогда не заботиться о нулевом значении в начале и в конце списка. Если вам нужно где-то проверить это, вы потерпите неудачу.
Других решений пока нет …