C++静态变量问题

来源:互联网 发布:unity3d可以不用vs2015 编辑:程序博客网 时间:2024/06/05 10:58

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

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;}
结果结果虽然获得了,但是静态变量这个问题还是无法解决。请指教!