指向节点的指针的子节点始终设置为NULL

时间:2015-03-14 01:45:39

标签: c++ pointers null

我正在使用递归调用创建一个带有AI的游戏,我有一个名为“Node”的结构,当用新的int [5] [5]填充它们时它们被填充但是当我返回并调用其他函数时 当我打电话给一个名为“bestMove”的乐趣来循环子女时,他们都指向NULL,例如:

struct Node 
{
    int state[5][5];
    Node* parent;
    Node* child[20];
    Node()
    {
     parent = NULL;
     for(int i=0;i<=19;i++)
         child[i] = NULL;
    }

    Node(Node* father)
    {
     parent = father;
     for(int i=0;i<=19;i++)
         child[i] = NULL;
    }
}

void fill_new_state(Node* childPointer)
{
    if(everything is Ok) //and its Okay
    childPointer = new Node();//with linking to parent and all...
    childPointer->state[row][col] = bla bla bla//fill 
    return;
}

void expandChildern(Node* root)
{
    fill_new_state(root->child[i])//looping
}

void bestMove(Node* root)
{
    Node* best = root->child[0] //if not null and it is not null
    //loop and chose the best 
    root = best
}

void main()
{
    Node* root = new Node();
    expandChildren(root);
    bestMove(root);
}
函数fill_new_state(Node* childPointer)中的

子项已填充且不为NULL 但是在fill_new_state(Node* childPointer)完全从函数expandChildren(Node* root)返回后,子项为NULL。

1 个答案:

答案 0 :(得分:0)

  

在函数fill_new_state(Node * childPointer)中填充子项   并且它不是NULL但是从fill_new_state返回后(节点*   childPointer)正好在函数expandChildren(Node * root)中   child为NULL。

那是因为你通过值传递指针,这是指针的副本。然后在fill_new_state中设置副本以指向新的Node对象,但这对函数外的任何其他指针都没有影响。

这相当于这样做:

void foo(int val)
{
   val = val + 1;
}

void bar()
{
   int x = 5;
   foo(x);
   // You can't expect x to be 6 here, because foo() incremented a
   // copy of x, not the original x.
}

获得所需行为的方法是通过引用传递指针参数:

void fill_new_state(Node* & childPointer)

...这样对fill_new_state()内部指针所做的任何更改都将在调用上下文中可见 - 即,当fill_new_state返回时,root-&gt; child [i]将被设置为非NULL。