我有一个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