我不明白为什么数据是唯一会给我带来问题的私有变量。最初我认为我可以通过在构造函数中第一次声明变量来解决这个问题,但我觉得必须有一种方法来私下定义变量,然后在构造函数中设置它们,而不会出现任何问题。我该如何解决这个问题?另外,无效使用非静态数据内存意味着什么?
#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;
}发布于 2015-05-15 10:23:47
标准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>。
发布于 2015-05-15 10:26:07
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+程序员:-)
https://stackoverflow.com/questions/30250518
复制相似问题