#include<iostream>
using namespace std;
template <class T>
class Array{
T *arr; int n,val,count;
public:
Array(int a):n(a){
arr=new T[n];
val=n-1; count=0;
}
void push(){
if(count>=n){
throw "Overflow. Array size limit exceeded";}
else{
int i; T num;
cout<<"Enter no.: ";
cin>>num;
if(cin.fail()){
cout<<"Wrong data type"<<endl;}
else{
for(i=0;i<n;i++){
*(arr+i+1)=*(arr+i);}
*arr=num; count++;
}
}
}
void pop(){
if(val<=0){
throw "Underflow. Array limit has been exhausted";}
else{
delete[] (arr+n-1);
val--; n-=1;
}
}
};
int main(){
int x,n;
cout<<"Enter size of an array: ";
cin>>n;
Array <int>a(n);
do{
try{
cout<<"Enter 1 to push,2 for pop and 0 to exit: ";
cin>>x;
if(x==1){
a.push();}
else if(x==2){
a.pop();}
}
catch(const char* e){
cerr<<e<<endl;}
catch(int a){
cout<<"Wrong data type";}
}while(x!=0);
return 0;
}
该程序的目的是在动态分配的数组中添加和删除元素。虽然push函数运行正常,但pop函数导致编译器显示核心转储。(完整错误太大,无法在此处发布)。我也尝试使用不带[]的delete运算符,但结果是一样的。请告诉我这个程序中pop功能有什么问题?
答案 0 :(得分:0)
您无法删除c类型数组中的特定元素。
arr = new T[n];
delete[](arr + n - 1);
一个解决方案是将索引保留在堆栈中的顶部项目,每次推送后执行index ++,并在每个pop索引之后 - 。
请阅读有关C类型数组以及如何使用它们的信息。
一些笔记 你应该为Array类之外的元素做输入。 调用类Stack,因为Array是别的东西。