這是一個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;
}
};
現在,我的小班的目的是創建一個單一的鏈接列表,並有能力扭轉它。如果我在返回結束時返回名爲'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;
}
的printList()被省略了空間的緣故,但它只是打印給出一個節點列表。問題是,當調用root-> reverse(root)時,root實際上並不會指向'previous'。
輸出會是這樣:
1
2
3
4
// the value of previous from the reverse function is 4
1
我真的不明白輸出。任何人都在意解釋發生了什麼? (爲什麼不反轉列表,即使我做了像這樣的root = root-> reverse(root),其中反向返回前一個,它會)爲什麼現在root只指向它自己?我是新來的C++,並感謝您的幫助!
應該提到的是,該程序正在泄漏內存,因爲C++的資源管理(即RAII)被繞過。 – Arafangion 2010-10-07 02:43:00
我真的不知道那麼多關於C++的管理,關心告訴我它在哪裏泄漏內存,也許我該如何修復它?我知道我應該只是閱讀文檔,但像這樣的真實世界的例子可以幫助點燃火災:) – kodai 2010-10-07 02:46:27
基本上,如果你調用new,你需要自己管理內存,這意味着調用delete。每個新的都必須有相應的刪除。不使用新的(即,只是在做'Foo foo'而不是'Foo * foo = new Foo()'),意味着你可以讓C++爲你管理這個資源,你不需要擔心刪除它。 (事實上,這樣做是錯誤的)。 – Arafangion 2010-10-07 03:04:29