我不明白为什么数据是私有的唯一导致我出现问题的变量。最初我以为我可以通过在构造函数中第一次声明变量来解决问题,但我觉得必须有一种方法来私下定义变量,然后在构造函数中设置它们没有任何问题。我该如何解决?另外,无效使用非静态数据存储器意味着什么?
server.getServerConfiguration().addHttpHandler(new StaticHttpHandler("src/main/webapp"), "/");
答案 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 +程序员: - )