我正在尝试使用数组实现堆栈,但收到错误。
class Stack{
private:
int cap;
int elements[this->cap]; // <--- Errors here
int top;
public:
Stack(){
this->cap=5;
this->top=-1;
};
指示的行有以下错误:
Multiple markers at this line
- invalid use of 'this' at top level
- array bound is not an integer constant before ']' token
我做错了什么?
答案 0 :(得分:18)
在C ++中,数组的大小必须是编译时已知的常量。如果不是这样,你会收到错误。
在这里,你有
int elements[this->cap];
请注意this->cap
在编译时不是常量,因为它取决于cap
的大小。
如果您希望拥有一个大小可变的数组,稍后会确定其大小,请考虑使用std::vector
,可以在运行时调整其大小。
希望这有帮助!
答案 1 :(得分:2)
您不能在声明中使用this
。
this
是传递给类中非静态方法的常量指针。它不存在于该范围之外。
此类数组声明需要大小的常量值/表达式。你不希望这样,你想要一个动态大小的容器。解决方案是使用std::vector
。
答案 2 :(得分:0)
由于其他人已经解释了这个问题的原因,这里有一个可能的解决方案来解决它。因为在编译时你可能不知道数组大小,并且赋值可能会限制使用std::vector<int>
考虑使用指针实现。
#include <algorithm>
class Stack{
private:
int cap;
int* elements; // use a pointer
int top;
public:
Stack(){
this->cap=5;
this->top=-1;
elements = new int[this->cap];
}
Stack(const Stack& s)
: cap(s.cap) , top(s.top), elements(NULL)
{
if(cap > 0) {
elements = new int[cap];
}
std::copy(s.elements , s.elements + cap, elements );
}
Stack& operator=(Stack s) {
swap(s, *this);
return *this;
}
~Stack() {delete [] elements;}
friend void swap(Stack& first, Stack& second)
{
using std::swap;
swap(first.top, second.top);
swap(first.cap, second.cap);
swap(first.elements, second.elements);
}
};
答案 3 :(得分:0)
更改
int elements[this->cap];
到
int* elements=new int[cap]