如何使动态创建的数组成为静态的?

How to make dynamically created arrays as static?

我想将动态创建的数组设为静态,这样做我将能够访问它们并修改它们的值, 下面的代码运行正常,但函数 disp() 正在打印一些垃圾值, 但是我已经修改了 push() 中的数组,但是这些更改没有得到反映

using namespace std;
#include<iostream>
static int t=-1;
int size=5;
template<class X>
class Stk
{
public:
X* arr=new X[size];
X pop()
{
    if(t<=-1)
        return -1;
    X val=arr[t];
    t--;
    cout<<"element popped --->"<<val<<"\n";
    return val;
}
void alloc_mem()
{
    X* newA = new X[size+1];
    std::copy(arr, arr + size, newA);
    delete[] arr;
    arr = newA;
    size++;
}
void push()
{
    X val;
    if(t==size-1)
        alloc_mem();
    cout<<"Enter Value:\n";
    cin>>val;
    t++;
    arr[t]=val;

}
void disp()
{
    if(t<=-1)
    {
        cout<<"Stack is empty\n";
    }
    else
    {
        cout<<"Stack elements are:\n";
        for(int i=t;i>=0;i--)
        {
            cout<<arr[i]<<endl;
        }
    }
}
};
int main()
{
while(1)
{
    int ch;
    cout<<"---------------\n";
    cout<<"1.PUSH\n2.POP\n3.DISPLAY\n";
    cout<<"------------------\n";
    cin>>ch;
    Stk <int >s;
    switch(ch)
    {
        case 1:
        {
            s.push();
            break;
        }
        case 2:
        {
            if(s.pop()==-1)
                cout<<"Stack is Empty\n";
            break;
        }
        case 3:
        {
            s.disp();
            break;
        }
    }
}
}

任何帮助将不胜感激!

正如评论中已经提到的,每个 while 循环都会创建一个新的 Stk 对象。所以每次你压入一个值时,while 循环都会创建一个包含一些垃圾值的新 Stk 对象。

所以您需要做的就是将 Stk <int >s; 移出 while 循环。然后您的所有更改都会反映出来。

如果您想要一个新对象,则必须向您的程序添加额外的功能。我做了更改,以防您仍然不明白:

using namespace std;
#include<iostream>
static int t=-1;
int size=5;
template<class X>
class Stk
{
public:
X* arr=new X[size];
X pop()
{
    if(t<=-1)
        return -1;
    X val=arr[t];
    t--;
    cout<<"element popped --->"<<val<<"\n";
    return val;
}
void alloc_mem()
{
    X* newA = new X[size+1];
    std::copy(arr, arr + size, newA);
    delete[] arr;
    arr = newA;
    size++;
}
void push()
{
    X val;
    if(t==size-1)
        alloc_mem();
    cout<<"Enter Value:\n";
    cin>>val;
    t++;
    arr[t]=val;

}
void disp()
{
    if(t<=-1)
    {
        cout<<"Stack is empty\n";
    }
    else
    {
        cout<<"Stack elements are:\n";
        for(int i=t;i>=0;i--)
        {
            cout<<arr[i]<<endl;
        }
    }
}
};
int main()
{
Stk <int >s; // Out of while Loop
while(1)
{
    int ch;
    cout<<"---------------\n";
    cout<<"1.PUSH\n2.POP\n3.DISPLAY\n";
    cout<<"------------------\n";
    cin>>ch;
    
    switch(ch)
    {
        case 1:
        {
            s.push();
            break;
        }
        case 2:
        {
            if(s.pop()==-1)
                cout<<"Stack is Empty\n";
            break;
        }
        case 3:
        {
            s.disp();
            break;
        }
    }
}
}

上面的答案和评论是正确的:每次在 main 中迭代循环时,您都在创建 Stk 的新实例,这不是您想要的。相反,正如 Suryansh Singh 所建议的那样,您应该在进入 while(1) 循环之前创建 Stk 的 1 个实例。

但我想我会解释一下 static(关键字)和 'dynamic'(概念):

'Dynamic'和static是对立的概念。 'Dynamic' 表示您的程序将根据情况更改其功能(例如,根据用户输入为数组分配一定数量的内存)。它们的关键字 static 对编译器具有非常具体的含义:https://www.geeksforgeeks.org/static-keyword-cpp/(在 DuckDuckGo 上首次命中)。从文章中理解的关键是 'When a variable is declared as static, space for it gets allocated for the lifetime of the program.' 这与 'dynamic'.

这个词的意思完全相反

我能想出的最好的类比是,想要动态创建一个 static 资源有点像想要建造一座带有电梯的建筑物,电梯可以到达建筑物的每一层。但是,在未来的某个时候,我可能会在建筑物中添加或移除楼层,而不是更换电梯。显然这不会很好地工作。

想想你的 static 变量 t。它可以改变价值,就像电梯可以去不同的楼层。但是,t 永远无法改变它的内存分配,就像电梯永远无法到达它所在建筑物外的楼层一样。

如果你想要一个共享的资源,可以被程序的不同部分访问,但也是动态创建的,你有很多选择来实现这一点,但你的代码不需要这样的东西。

最后,我通过仅讨论适用于变量的方式来简化 static 的含义——这适用于该问题的范围。应用于 类 或方法时,含义有所不同。