我有一个包含3个类的程序。
第一个用于定义节点(我的节点是一个包含9个元素的数组) - 第二个包含一些函数 - 第三个是定义静态堆栈(我有一个包含100个成员的堆栈,每个成员是一个包含9个成员的数组)< / p>
假设在main()中,我调用了第二个类中的一个函数(例如expand())。 expand函数应该将节点推入堆栈(推入UN)并更新堆栈指针。在那之后,例如我想访问堆栈的顶级节点并使用main()弹出该节点。但我很成功。当我通过调试工具观察UN和top节点时,我发现每次推送后它们的数量都被重置(堆栈不接受新元素)。怎么了?
这里是需要的部分代码:
#include<iostream>
using namespace std;
#define max 100
class node
{
public:
int node_n[9];
friend class func;
friend class stack;
};
node n;
class node;
class func
{
public:
func();
void expand(node,stack);
friend class stack;
};
class node;
class stack
{
private:
int sp;//stack pointer
public:
node un[max];//saves expanded noded(children)
stack();
int isempty(); //this will show whether stack is empty or not
int isfull(); //this will show whether stack is full or not
void push(node);
node pop();
};
//****************************
stack::stack()
{
sp=-1;
}
//****************************
int stack::isempty()
{
if(sp==-1)
return true;
else
return false;
}
//****************************
int stack::isfull()
{
return sp==max-1;
}
//****************************
node stack::pop() //un=un-[n]
{
for(int k=0;k<=8;k++)
n.node[k]=un[sp].node[k];
sp--;
return n;
}
//****************************
void stack::push(node n ) //un=un+{x1....xn}
{
sp++;
for(int k=0;k<=8;k++)
un[sp].node[k]=n.node[k];
}
//****************************
void func::expand(node n,stack st)
{
if ( n.node_n[0]==0 )
{
if(n.node_n[1]==0)
{
n.node_n[0]=1;
n.node_n[1]=1;
st.push(n);
.
.
.
//******************************
int main()
{
func b;
stack st;
node n2;
node s; //initial state
node g; //goal state
for(int h=0;h<=8;h++)
{
s.node[h]=0;
g.node[h]=1;
}
//n2=s;
st.push(s);
Lable1:
n2=st.pop();
b.expand(n2,st);
goto Lable1;
system("pause");
return(0);
}
答案 0 :(得分:0)
此功能
void func::expand(node n,stack st)
按值st
参数,意味着它有自己的st
副本,并且它所做的任何更改都只会影响该副本。
您可能想要的是通过引用传递st
,以便该函数可以对传入的对象进行更改。为此,请将函数声明和定义更改为:
void func::expand(node n,stack &st)