错误:无效使用非静态数据成员"容量"int data[容量];



我不明白为什么数据是私人唯一引起我问题的变量。最初,我认为我可以通过在构造函数中首次声明变量来解决问题,但是我觉得必须有一种方法可以私下定义变量,然后将它们设置在构造函数中而不会出现任何问题。我该如何解决?另外,无效使用非静态数据存储器是什么意思?

#include <cassert>
#include <iostream>
#include <vector>
using namespace std;
class stack{
private: 
    int capacity;
    int data[capacity];
    int top;
    int bottom;

public:
   stack(){
        top=0;
        bottom=0;
        capacity=100;
   }
   bool isEmpty(){
        return top==bottom;
   }
   int pop(stack S){
        //assert(!isEmpty());
        int elem = data[top];
        top--;
        return elem;  
   }
   void push(stack S,int x){
        assert(top<capacity-1);
        top++;
        data[top]=x;
        return;
   }
};
int main()
{
    return 0;    
}

在标准C 中不允许变量长度阵列。使用动态数组,或更好的std::vector<int> data(capacity)

另外,您应该使用构造函数初始化器列表初始化成员变量,

stack(): capacity(100), data(capacity), top(0), bottom(0){} // assuming you use `std::vector<int> data;`

如果您不能使用std::vector(否则您应该做的家庭作业!),则可以使用动态数组

int* data;

并将您的构造函数声明为

stack(): capacity(100), data(new int[capacity]), top(0), bottom(0){}

然后,您必须声明一个破坏者

~stack() { delete[] data;} 

因此您没有内存泄漏。接下来,您还应该定义复制构造函数和分配运算符,因此事情变得有些复杂。如果可以的话,只需使用std::vector<int>即可。

int data[capacity];

正在以 compile 时间进行操作,在capacity具有已知值之前。

可能是最简单的解决方案,如果您必须使用数组并且所有对象都具有相同的容量(与当前构造函数一样),就是将您的变量声明更改为:

static const int capacity = 100;

将有效地将其用作编译时常数,并且您的错误消失了。


如果您仅限于数组,并且每个对象都需要一个潜在的不同容量,则通常的方法是动态分配您在构造函数中所需的内容。首先,使data成为简单的指针:

int *data;

然后,在您的构造函数中:

top=0;
bottom=0;
capacity=100;
data = new int[capacity];  // do this to create it.

只需记住在击路仪中使用delete[] data,并遵守3(或5个)的规则,以确保您添加其他需要的方法,例如复制/移动构造函数,并复制/移动分配运算符。没有这些,您可能会发现共享基本数据的对象,通常是非常坏主意。


但是,您应该记住,经验丰富的编码器将更有可能使用C 语言/库的全部功能,然后使用vector。这些比数组更适合适应性,您的同事将被视为真正的C 程序员,而不是C 一个: - )

最新更新