遇到错误:“数组边界不是 ']' 标记前的整数常量”

14

我正在尝试使用数组实现一个栈,但是我收到了一个错误。

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

我做错了什么?


对于一个this不存在... - Joe
1
...而C++没有可变长度数组(VLAs)。 - Daniel Fischer
此外,成员数组的大小必须在编译时知道。 - Matteo Italia
3个回答

30

在C++中,数组的大小必须是在编译时已知的常量。如果不是这种情况,将会出现错误。

这里,你有

int elements[this->cap];

请注意,this->cap 不是在编译时已知的常量,因为它取决于 cap 的大小。

如果您想要一个大小可变的数组,其大小稍后确定,请考虑使用 std::vector,它可以在运行时调整大小。

希望这可以帮到您!


2

在声明时无法像那样使用 thisthis 是传递给类中非静态方法的常量指针,它不存在于该范围之外。

这种数组声明需要常量值/表达式来确定大小。您不想要这个,您需要一个动态大小的容器。 解决方案是使用 std::vector


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

我不太知道如何实现复制构造函数和operator==。你能帮我吗? - user1849859
@user1849859 已添加。请阅读c++复制-交换惯用语,以充分理解为什么我们必须实现所有这些内容,如果我们使用动态数组。 - andre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接