我有一個Node類和一個NodeManager類。 NodeManager對象持有指向節點的指針。我想讓這個Node指針指向一個在堆上分配的Node對象。堆分配發生在NodeManager.init()
。指針數據成員在堆上初始化
這是代碼。
class Node
{
public:
int index;
};
class NodeManager
{
public:
NodeManager() {}
void initNode(Node *b)
{
b = new Node();
}
Node *node;
};
int main()
{
NodeManager manager;
manager.initNode(manager.node);
cout << manager.node << endl; //prints a bad pointer
system("pause");
return 0;
}
當然,當我改變initNode()
到:
void initNode()
{
this->node = new Node();
}
的manager
對象實際上 「記住」 它node
的地址。 問題是,在第一個代碼中,地址不被記住,應用程序輸出一個錯誤的地址。這是爲什麼?
編輯: 爲了使事情更清楚,我正在處理一個具有數據成員的類,該成員是指向對象的指針。我的類有一個遞歸成員函數,它將數據成員指針作爲「起點」參數,並一直調用自己分配和創建對象的「子」。但是,然後,我得到這個問題。私人數據成員不會被記住,並且畢竟是一個NULL或一個糟糕的指針。
如果這就是'NodeManager',那麼您只是試圖重新創建一個非常有限的智能指針。 – chris
我建議您查看一些已經發布到互聯網上的鏈接列表的現有示例。 –
數學家已經提供了正確的答案,但我的問題是你爲什麼要編寫你的init函數? – MikeMB