2012-12-01 63 views
0

我很好奇如何實現這樣的功能。例如,如何在main中調用函數包含對節點的引用

我有類似:

class Node { 
public: 
int dataItem; 
Node *next; 
}; 

void foo(int number, Node & n) { 
// do something 
} 

然後在主,我需要調用該函數,這樣的事情不工作:

int main() { 
Node *n; 
int data; 
foo(data, n); 
return 0; 
} 

我會需要一個包裝函數爲了通過參考在主要傳遞節點,這是我在掙扎,我只是不知道如何處理這個問題。我嘗試了一些想法,我在網上閱讀了很多,但我只是沒有把握它。理解如何實現這個包裝函數的任何幫助都會很棒。

回答

4

根本沒有Node。你只有一個指向Node的指針,它並不指向任何地方(你的data也是未初始化的)。 Node&類型的參考參數要求傳遞Node,不是Node*,讓你真正想要的是:

int main() { 
    Node n; 
    int data = 0; 
    foo(data, n); // Pass the Node directly 
    return 0; 
} 

或者,如果你真的需要n是一個指針,你可以做到以下幾點:

int main() { 
    Node* n = new Node(); 
    int data = 0; 
    foo(data, *n); // Dereference n to get the Node it points to 
    delete n; 
    return 0; 
} 

但是,我不主張在這種情況下使用原始指針 - 您必須記住delete以避免內存泄漏。您可以改爲使用std::unique_ptr<Node> n(new Node())而不是Node* n = new Node(),但使用具有自動存儲持續時間的Node(如第一個示例中)是首選。

+0

我去了第二個建議,創建一個默認的構造節點,和它的作品。但我確實留意了有關內存泄漏的警告。只要我在主要返回之前簡單地刪除n,我應該沒問題。 –

+0

@DerekW爲什麼你不能做第一個原因?這是*更好的做法。 –

+0

我在想,我需要一個指針,但看看爲什麼我試圖完成它沒有必要使用原始指針。所以我也執行了第一個建議,確實也起作用。你幫了我很多,非常感謝你! –

1

您的功能foo引用了Node,但是您正在向它傳遞一個指針。更改無論是功能,還是在main()的代碼,例如

int main() { 
Node n; 
int data; // beware, may contain garbage value. 
foo(data, n); 
return 0; 
} 

void foo(int number, Node* n) { 
// do something 
} 
相關問題