2011-07-15 104 views
2

我有一個類節點:C++:傳遞指針變量起作用

class Node { 
public: 
    int item; 
    Node * nextLink; 
}; 

外我聲明一個節點指針的函數:

Node * newNode; 

然後,我通過這個指針指向一個函數foo:

void foo(Node * node) { 

    node = new Node(); 

    node->item = 1; 

    Node * anotherNode = new Node(); 

    anotherNode->item = 2; 

    node->nextLink = anotherNode; 
} 

實際通話:

foo(newNode); 

在foo結束時(但在現有)之前,我可以看到node-> item和node-> nextLink指向正確的位置。但是,當從foo返回時,我檢查newNode,並且該項是正確的,但nextLink不在那裏。

有什麼建議嗎? 謝謝

回答

5

您需要傳遞參考。您正在修改指針的副本

嘗試

void foo(Node*& node) 
+0

即時更新這個問題也是選項,但是當我知道我需要什麼,所有我需要從Node/Foo對象的值 – user63898

4

foo()你修改被傳遞給函數指針的本地副本。更改foo以下幾點:

void foo(Node ** node) { 

    *node = new Node(); 

    (*node)->item = 1; 

    Node * anotherNode = new Node(); 

    anotherNode->item = 2; 

    (*node)->nextLink = anotherNode; 
} 

接着,電話就變成了:

foo(&newNode); 
3

你說這是怎麼回事並不完全意義的我。由於您是通過值傳遞指針變量,所以在調用函數中它的值根本不應該改變,就我所見,所以實際上不應該看到函數的任何結果。

雖然我無法解釋發生的事情在當前的代碼的細節,我強烈建議你試試這樣說:

Node * foo(void) { 

    Node * node = new Node(); 

    node->item = 1; 

    Node * anotherNode = new Node(); 

    anotherNode->item = 2; 

    node->nextLink = anotherNode; 

    return node; 
} 

,並呼籲像:

Node *newNode = foo(); 

由於您的功能實際上並沒有對傳入的指針值做任何事情,所以使用局部變量創建所有內容並返回指向新分配節點的指針更有意義。 (你也可以按照其他人的建議傳遞指針的引用,但是在這種情況下,我不認爲這是一種很好的編程風格,只是簡單地從函數返回指針並將其指定給呼叫代碼中的適當變量)。

+0

這是一個好主意,唯一的問題是我已經使用返回參數爲別的東西。 –

2

您有三種選擇。您可以傳遞一個節點**作爲輸入,一個節點* &作爲輸入,或者您可以從foo方法返回一個節點*。所有三個選項都有效。

2

如果你想要的功能foo改變指針,你有指針的ADRESS調用它,就像這樣:

Node * newNode; 

void foo(Node ** nodepointer) { 
    (*nodepointer) = new Node(); 
    (*nodepointer)->item = 1; 
    Node * anotherNode = new Node(); 
    anotherNode->item = 2; 
    anotherNode->nextLink = NULL; 
    (*nodepointer)->nextLink = anotherNode; 
} 

foo(&newNode); 

如上圖所示,你也應該設置anotherNode->nextLinkNULL紀念名單末尾。