所以我的问题是我想在给定地址上创建新对象。
MethodA()
{
TreeNode* nodeResult = NULL;
initObject(nodeResult);
//nodeResult is NULL anyway
}
void initObject(TreeNode* obj)
{
if(obj == NULL)
{
obj = new TreeNode();
}
}
似乎创建了新对象,但在initObject
方法的括号末尾删除了它。
答案 0 :(得分:6)
这会失败,因为您的initObject
方法想要修改调用方的变量,但是您要传递它的副本。将其更改为:
void initObject(TreeNode* &obj)
{
if(obj == NULL)
{
obj = new TreeNode();
}
}
这将为initObject
函数提供引用到调用者的变量,并且在函数返回后调用者可以看到对它的任何赋值。
答案 1 :(得分:5)
您必须使用引用,因为指针是值类型
MethodA()
{
TreeNode* nodeResult = NULL;
initObject(nodeResult);
//nodeResult is NULL anyway
}
void initObject(TreeNode* & obj)
{
if(obj == NULL)
{
obj = new TreeNode();
}
}
答案 2 :(得分:1)
您需要了解指针是什么。
指针是存储存储块地址的变量。复制指针只会复制地址。
下面:
obj = new TreeNode();
您为新obj
的地址TreeNode
提供了新值,但就是这样。你没有退出你的功能。由于参数TreeNode* obj
是nodeResult
的变量副本,只存储地址,nodeResult
本身不会更改。
您可以使用双指针或reference解决问题,如下所示:
void initObject(TreeNode*& obj)
{
if(obj == NULL)
{
obj = new TreeNode();
}
}
然后传递给initObject
的内容不是nodeResult
的副本,而是对变量本身的引用,使其可以修改。
答案 3 :(得分:1)
TreeNode* nodeResult = NULL;
是包含内存地址的变量。
当您致电initObject(nodeResult);
时,您传递该指针的内容,该指针的内容为NULL
。您需要自己传递指针,因此在函数调用后变量具有有效值。如果您有int
而不是TreeNode*
,则可以将int
作为&
或*
传递。同样:
void initObject(TreeNode*& obj) // see it as int&
{
if(obj == NULL)
{
obj = new TreeNode();
}
}
或
void initObject(TreeNode* * obj) // see it as int*
{
if(*obj == NULL)
{
*obj = new TreeNode();
}
}