我正在使用递归调用创建一个带有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。
答案 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。