Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;在方法中创建新对象_C++ - Fatal编程技术网

C++ C++;在方法中创建新对象

C++ C++;在方法中创建新对象,c++,C++,所以我的问题是,我想在给定地址上创建新对象 MethodA() { TreeNode* nodeResult = NULL; initObject(nodeResult); //nodeResult is NULL anyway } void initObject(TreeNode* obj) { if(obj == NULL) { obj = new TreeNode(); } } 新对象似乎已创建,但在initObject方法的方括

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

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

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

您必须使用引用,因为指针是值类型

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

您必须使用引用,因为指针是值类型

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

这会失败,因为您的
initObject
方法想要修改调用方的变量,但您正在传递它的副本。将其更改为:

void initObject(TreeNode* &obj)
{
    if(obj == NULL)
    {
        obj = new TreeNode();
    }
}

这将为
initObject
函数提供对调用方变量的引用,并且在函数返回后调用方可以看到对它的任何赋值。

这将失败,因为
initObject
方法想要修改调用方的变量,但您正在传递它的副本。将其更改为:

void initObject(TreeNode* &obj)
{
    if(obj == NULL)
    {
        obj = new TreeNode();
    }
}

这将为
initObject
函数提供对调用方变量的引用,并且在函数返回后,调用方可以看到对它的任何赋值。

您需要了解指针是什么

指针是存储内存块地址的变量。复制指针只是复制地址

在这里:

您给
obj
一个新值,即新
TreeNode
的地址,但仅此而已。您不会从函数中返回它。由于参数
TreeNode*obj
是只存储地址的
nodeResult
的变量副本,
nodeResult
本身没有改变

您可以使用双指针或a来解决问题,如下所示:

void initObject(TreeNode*& obj)
{
    if(obj == NULL)
    {
        obj = new TreeNode();
    }
}

然后传递给
initObject
的不是
nodeResult
的副本,而是对变量本身的引用,使其可修改。

您需要了解指针是什么

TreeNode* nodeResult = NULL;
指针是存储内存块地址的变量。复制指针只是复制地址

在这里:

您给
obj
一个新值,即新
TreeNode
的地址,但仅此而已。您不会从函数中返回它。由于参数
TreeNode*obj
是只存储地址的
nodeResult
的变量副本,
nodeResult
本身没有改变

您可以使用双指针或a来解决问题,如下所示:

void initObject(TreeNode*& obj)
{
    if(obj == NULL)
    {
        obj = new TreeNode();
    }
}
然后传递给
initObject
的不是
nodeResult
的副本,而是对变量本身的引用,使其可修改

TreeNode* nodeResult = NULL;
是一个包含内存地址的变量

调用
initObject(nodeResult)时
传递该指针的内容,该指针在该点处为
NULL
。您需要将指针自身传递给它,以便在函数调用后变量具有有效值。如果您使用的是
int
而不是
TreeNode*
,则将
int
作为
&
*
传递。同样地:

void initObject(TreeNode*& obj) // see it as int&
{
    if(obj == NULL)
    {
        obj = new TreeNode();
    }
}

是一个包含内存地址的变量

调用
initObject(nodeResult)时
传递该指针的内容,该指针在该点处为
NULL
。您需要将指针自身传递给它,以便在函数调用后变量具有有效值。如果您使用的是
int
而不是
TreeNode*
,则将
int
作为
&
*
传递。同样地:

void initObject(TreeNode*& obj) // see it as int&
{
    if(obj == NULL)
    {
        obj = new TreeNode();
    }
}


除了@pw94的正确答案之外,值得注意的是,该对象没有在代码中被删除,只是丢失了指向它的指针。如果你在C++中调用<代码>新< /代码>来制作一个对象,它将不会被删除,直到你在指针上调用<代码>删除>代码>。现代惯例是利用
std::shared_ptr
std::unique_ptr
尽可能避免手动操作。一定要仔细阅读它们及其背后的内存管理/所有权概念。@MatthewWalton的评论应该添加到其中一个答案中。指针没有什么特别之处。如果您考虑<代码>空隙INITIONT(int x){if(x=0)x=42;}无效f*){int x=0;INITUTE(x);},您将了解发生了什么。除了@ pW91的正确答案之外,值得注意的是,该对象还没有在代码中被删除,您刚刚丢失了指向它的指针。如果你在C++中调用<代码>新< /代码>来制作一个对象,它将不会被删除,直到你在指针上调用<代码>删除>代码>。现代惯例是利用
std::shared_ptr
std::unique_ptr
尽可能避免手动操作。一定要仔细阅读它们及其背后的内存管理/所有权概念。@MatthewWalton的评论应该添加到其中一个答案中。指针没有什么特别之处。如果考虑<代码>空隙INITUTION(int x){if(x=0)x=42;}无效f*({int x=0;INITUTHORE(x);}),您将了解发生了什么。