Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 错误:无效使用非静态数据成员';容量';int数据[容量];_C++ - Fatal编程技术网

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

C++ 错误:无效使用非静态数据成员';容量';int数据[容量];,c++,C++,我不明白为什么数据是唯一一个私人变量,导致我的问题。最初我认为我可以通过在构造函数中第一次声明变量来解决这个问题,但我觉得必须有一种方法来私下定义变量,然后在构造函数中设置它们,而不会出现任何问题。我该如何解决这个问题?非静态数据存储器的无效使用又意味着什么 #include <cassert> #include <iostream> #include <vector> using namespace std; class stack{ private:

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

#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;    
}
#包括
#包括
#包括
使用名称空间std;
类堆栈{
私人:
国际能力;
int数据[容量];
int top;
内底;
公众:
堆栈(){
top=0;
底部=0;
容量=100;
}
布尔是空的{
返回顶部==底部;
}
int pop(堆栈S){
//断言(!isEmpty());
int elem=数据[顶部];
顶部--;
返回元素;
}
无效推送(堆栈S,整数x){

标准C++中不允许使用top(p>>可变长度数组)。使用动态数组,或者使用更好的代码,<代码> STD::矢量数据(容量)< /C> > 另外,应该使用构造函数初始值设定项列表初始化成员变量

stack(): capacity(100), data(capacity), top(0), bottom(0){} // assuming you use `std::vector<int> data;`
并将构造函数声明为

stack(): capacity(100), data(new int[capacity]), top(0), bottom(0){}
然后,您必须声明一个析构函数

~stack() { delete[] data;} 
这样就不会有内存泄漏。接下来还应该定义复制构造函数和赋值运算符,这样事情就变得有点复杂了。如果可以,只需使用
std::vector

int data[capacity];
在编译时操作,远远早于
容量
具有已知值

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

static const int capacity = 100;
这将有效地允许将其用作编译时常量,并且错误将消失


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

int *data;
然后,在构造函数中:

top=0;
bottom=0;
capacity=100;
data = new int[capacity];  // do this to create it.
只需记住在析构函数中删除[]数据,并遵守规则3(现在是5),确保添加其他必要的方法,如复制/移动构造函数和复制/移动赋值运算符。如果没有这些方法,您可能会发现对象共享基础数据,这通常是一个非常糟糕的主意



<>但是,你应该记住,经验丰富的程序员更可能使用C++语言/库的全部力量,而不是使用<代码>向量。这些比数组更适合你,你会被同事们认作是真正的C++程序员而不是C+1:-(<)/P>“但是我的作业中说禁止使用向量”还要考虑一下
int-capacity;
int-data[capacity];
意味着什么:数据的大小取决于容量,容量不可能被分配任何值。kalkid,只是出于兴趣,如果你不允许使用向量(根据你的一条评论),为什么你有
#在你的代码中包含
?:-)并确保你理解,除非设置了NDEBUG,否则断言是不好的。它们有助于在开发过程中发现问题(或家庭作业)但是,对于健壮的代码来说,它们不是最好的。@paxdiablo不是反过来的吗,也就是说,
#define NDEBUG
禁用断言?@vsoftco,抱歉,你是对的。这正好说明我使用断言的程度:-)
top=0;
bottom=0;
capacity=100;
data = new int[capacity];  // do this to create it.