Это вопрос noobie, но я не уверен, как пройти по ссылке в C++. У меня есть следующий класс, который устанавливает узел и несколько функций.Передача объекта по ссылке в C++
class Node
{
public:
Node *next;
int data;
Node(int dat)
{
next = NULL;
data = dat;
}
Node* getNext()
{ return next; }
void setNext(Node *n)
{ next = n;}
void reverse(Node *root)
{
Node *previous = NULL;
while(root != NULL)
{
Node *next = root->getNext();
root->setNext(previous);
previous = root;
root = next;
}
root = previous;
}
};
Теперь целью моего маленького класса является создание уникально связанного списка и возможность его отменить. И, похоже, он работает нормально, если я верну узел с именем «предыдущий» в конце обратного.
Но посмотрите на мою основную функцию:
int main()
{
Node *root = new Node(1);
Node *num2 = new Node(2);
Node *num3 = new Node(3);
Node *num4 = new Node(4);
root->setNext(num2);
num2->setNext(num3);
num3->setNext(num4);
root->printList();
root->reverse(root);
root->printList();
return 0;
}
перечень печати() было опущено для пространства, но он просто выводит список данный узел. Проблема в том, что когда root-> reverse (root) вызывается, root фактически не указывает на «предыдущий».
Выход будет таким:
1
2
3
4
// the value of previous from the reverse function is 4
1
Я действительно не понимаю, выход. Кто-нибудь хочет объяснить, что происходит? (Почему нет списка в обратном порядке, хотя если бы я сделал что-то вроде этого root = root-> reverse (root), где обратное возвращает предыдущее, это было бы), почему он теперь root указывает только на себя? Я новичок в C++ и ценю вашу помощь!
Следует упомянуть, что эта программа выполняет утечку памяти, поскольку управление ресурсами C++ (т.е. RAII) обходит. – Arafangion
Я действительно мало знаю об управлении на С ++, расскажу, где это утечка памяти, и, может быть, как я могу это исправить? Я знаю, что мне нужно просто прочитать документы, но пример такого реального мира может помочь разжечь огонь :) – kodai
В принципе, если вы вызываете новое, вам нужно самому управлять памятью, а это значит, что вы вызываете delete. Каждое новое должно иметь соответствующее удаление. Не использовать новый (т. Е. Просто делать «Foo foo», а не «Foo * foo = new Foo()»), значит, вы можете позволить C++ управлять этим ресурсом для вас, и вам не нужно беспокоиться об его удалении. (Infact, это ошибка). – Arafangion