Getting error “array bound is not an integer constant before ']' token”

匿名 (未验证) 提交于 2019-12-03 02:26:02

问题:

I am trying to implement a stack using an array but I receive an error.

class Stack{ private:     int cap;     int elements[this->cap]; // <--- Errors here     int top; public:   Stack(){      this->cap=5;      this->top=-1; }; 

The indicated line has these errors:

Multiple markers at this line - invalid use of 'this' at top level - array bound is not an integer constant before ']' token 

What am I doing wrong?

回答1:

In C++, the size of an array must be a constant known at compile-time. You'll get an error if that isn't the case.

Here, you have

int elements[this->cap]; 

Notice that this->cap isn't a constant known at compile-time, since it depends on how big cap is.

If you want to have a variably-sized array whose size is determined later on, consider using std::vector, which can be resized at runtime.

Hope this helps!



回答2:

You cannot use this in the declaration like that. this is a constant pointer passed to non-static methods in your class. It does not exist outside of that scope.

Such array declarations need constant values/expressions for the size. You don't want that, you want a dynamicly sized container. The solution is to use a std::vector.



回答3:

Since other have already explained the cause of this issue, here is a possible solution to resolve it. Since it seems you may not know the array size at compile time and the assignment may restrict the use of std::vector<int> consider using a pointer implementation.

#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);     } }; 


回答4:

Change

int elements[this->cap]; 

to

int* elements=new int[cap] 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!