C ++在Method中创建新对象

时间:2016-05-27 07:53:20

标签: c++

所以我的问题是我想在给定地址上创建新对象。

MethodA()
{
   TreeNode* nodeResult = NULL;
   initObject(nodeResult);
   //nodeResult is NULL anyway
}
void initObject(TreeNode* obj)
{
    if(obj == NULL)
    {
        obj = new TreeNode();
    }
}

似乎创建了新对象,但在initObject方法的括号末尾删除了它。

4 个答案:

答案 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* objnodeResult的变量副本,只存储地址,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();
    }
}