错误:无效使用非静态数据成员' capacity' int data [capacity];

时间:2015-05-15 02:21:28

标签: c++

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

server.getServerConfiguration().addHttpHandler(new StaticHttpHandler("src/main/webapp"), "/");

2 个答案:

答案 0 :(得分:5)

标准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>

答案 1 :(得分:3)

int data[capacity];

正在编译时间进行操作,早在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 +程序员: - )