如何使动态创建的数组成为静态的?
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
的含义——这适用于该问题的范围。应用于 类 或方法时,含义有所不同。
我想将动态创建的数组设为静态,这样做我将能够访问它们并修改它们的值, 下面的代码运行正常,但函数 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
的含义——这适用于该问题的范围。应用于 类 或方法时,含义有所不同。