C++静态变量问题

今天实现一个函数的时候第一思路就是静态变量

eg:

template<class Elem>
int putTreeInArray(GTNode<Elem> *t1, Elem a[])
{
    static i = 0;
    a[i] = t1->value();
    for(GTNode<Elem> *temp = t1->leftmost_child();
        temp != NULL; temp = temp->right_sibling())
            putTreeInArray(temp,a);
    return i;
}

而这个函数的目的是将一个普通树的结点值放入数组中,并返回结点数,而我将在下面一个函数调用这个函数两次。

eg:

template<class Elem,class Comp>
bool isEqualTree(GTNode<Elem> *t1, GTNode<Elem> *t2)
{
	Elem a[MAXSIZE], b[MAXSIZE];
	int c,d;
	c = putTreeInArray<Elem>(t1,a);
	d = putTreeInArray<Elem>(t2,b);
	if( c != d)	return false;
	inssort<Elem,Comp>(a,c);
	inssort<Elem,Comp>(b,d);
	for(int j = 0; j < c; j++)
	{
		if( a[j] != b[j])
			return false;
	}
	return true;
}

结果在测试的时候发现结果错误,于是乎就开始调试分析。

经调试发现调用两次putTreeInArray函数时,里面的static i变量 不会重置还是会在第一个基础上递增。

于是乎我打算再构造一个函数,eg:

template<class Elem>
int putTreeInArray(GTNode<Elem> *t1, Elem a[])
{
	static j= 0;
	a[j] = t1->value();
	for(GTNode<Elem> *temp = t1->leftmost_child(); 
		temp != NULL; temp = temp->right_sibling())
			putTreeInArray(temp,a);
	return j;
}

发现还是结果错误,经过分析发现:除了第一次重置时将静态变量重置为0之外,运用j并不能改变静态值,估计是因为静态变量用同一块内存地址,实质上还是同一个静态变量。还是从i开始递增。所以便在网络上寻找可以重置或者删除静态变量的方法,一番寻找后无果,希望如果有人看到这篇文章,又恰好知道如果重置或删除请告诉我。所以打算抛弃静态变量用另外方法就是修改参数,加上一个整形变量。

template<class Elem>
int putTreeInArray(GTNode<Elem> *t1, Elem a[],int i)
{
	//static i = 0;
	//cout<<"static: "<<i<<endl;
	a[i] = t1->value();
	for(GTNode<Elem> *temp = t1->leftmost_child(); 
		temp != NULL; temp = temp->right_sibling())
			putTreeInArray(temp,a,i++);
	return i;
}

template<class Elem,class Comp>
bool isEqualTree(GTNode<Elem> *t1, GTNode<Elem> *t2)
{
    Elem a[MAXSIZE], b[MAXSIZE];
    int i=0;
    int c,d;
    c = putTreeInArray<Elem>(t1,a,i);
    d = putTreeInArray<Elem>(t2,b,i);
    if( c != d)    return false;
    inssort<Elem,Comp>(a,c);
    inssort<Elem,Comp>(b,d);
    for(int j = 0; j < c; j++)
    {
        if( a[j] != b[j])
            return false;
    }
    return true;
}
结果结果虽然获得了,但是静态变量这个问题还是无法解决。请指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值