利用动态数组来实现栈代码的错误C++
来源:3-2 栈的基本实现
慕姐8741563
2018-08-02
老师好,我在利用动态数组来实现栈时,遇到了错误,错误提示如下:invalid use of member,did you forget & 全部代码如下: #include<cstdio> #include<iostream> using namespace std; template<typename E> class Array{ public: E *data; int size; Array(int capacity) { data=new E[capacity]; size=0; } void add(int index,E e) { if(sizeof(data)/sizeof(data[0])==size) { resize(2*size); } for(int i=size-1;i>=index;i--) { data[i+1]=data[i]; } data[index]=e; size++; } void addLast(E e) { add(size,e); } int getSize() { return size; } bool isEmpty() { if(sizeof(data)/sizeof(data[0])==0) { return true; } return false; } E remove(int index) { E ret=data[index]; for(int i=index+1;i>=0;i--) { data[i-1]=data[i]; } size--; return ret; } E removeLast() { E ret=data[size-1]; size--; return ret; } void resize(int newCapacity) { E *newData; newData=new E[newCapacity]; for(int i=0;i<size;i++) { newData[i]=data[i]; } data=newData; } }; template <typename T> class ArrayStack { public: Array<T>array1(); ArrayStack( ) { Array<T>array1(); } ArrayStack(int capacity) { Array<T>array1(capacity); } int getSize() { return array1.getSize(); } bool isEmpty() { return array1.isEmpty(); } void push(T t)//[with T=int] { array1.add(0,t); } T pop() { return array1.removeLast(); } }; int main() { ArrayStack<int>stack1(20); // stack1.array1.add(1,2); int a=1; stack1.push(a); // stack1.push(a); // stack.push(2); // stack.push(3); // int a=stack.pop(); // cout<<a<<endl; }// 我已经在网上找了很久的答案了,实在找不到,周围也没有人可以问,所以请老师帮忙解答,万分感谢。
写回答
1回答
-
liuyubobobo
2018-08-02
猛地扫下来,有不少问题。
比如,24行:sizeof(data)/sizeof(data[0])是常数。因为data是指针。sizeof(data)是这个指针的大小,而不是整个连续空间的大小。你需要像课程中一样,设立capacity变量。
比如83行,调用了一个没有参数的Array的构造函数,但你的Array类中,没有没有参数的构造函数。
比如91行,你初始化的array1不是83行的array1。91行的array1是一个同名局部变量。
建议:一个类一个类的做,一个方法一个方法的测试。事实上,课程里也是这么做的。每一个小节基本都会基于这一个小节的任务进行简单的测试。来验证。你可以一定程度的加强测试。
你的Array没有经过验证,基于Array来做Stack,出了错更难找。
课程已经有同学基于C++实现了课程的全部代码,可以参考。传送门:https://github.com/houpengfei88/Play-with-Data-Structures
加油!
532018-08-02
相似问题