首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:在data[capacity]中无效使用非静态数据成员“capacity”;

错误:在data[capacity]中无效使用非静态数据成员“capacity”;
EN

Stack Overflow用户
提问于 2015-05-15 10:21:28
回答 2查看 432关注 0票数 0

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

代码语言:javascript
复制
#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;    
}
EN

回答 2

Stack Overflow用户

发布于 2015-05-15 10:23:47

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

此外,还应使用构造函数初始化器列表来初始化成员变量,

代码语言:javascript
复制
stack(): capacity(100), data(capacity), top(0), bottom(0){} // assuming you use `std::vector<int> data;`

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

代码语言:javascript
复制
int* data;

并将构造函数声明为

代码语言:javascript
复制
stack(): capacity(100), data(new int[capacity]), top(0), bottom(0){}

然后,您必须声明析构函数

代码语言:javascript
复制
~stack() { delete[] data;} 

所以你不会有内存泄漏。接下来你还应该定义你的复制构造函数和赋值操作符,这样事情就变得有点复杂了。如果可以的话,就使用std::vector<int>

票数 5
EN

Stack Overflow用户

发布于 2015-05-15 10:26:07

代码语言:javascript
复制
int data[capacity];

capacity具有已知值之前很久就在编译时被执行。

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

代码语言:javascript
复制
static const int capacity = 100;

这将有效地允许将其用作编译时常量,并且您的错误将消失。

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

代码语言:javascript
复制
int *data;

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

代码语言:javascript
复制
top=0;
bottom=0;
capacity=100;
data = new int[capacity];  // do this to create it.

只需记住在析构函数中使用delete[] data,并遵守3(或现在的5)规则,确保您添加了其他所需的方法,如复制/移动构造函数和复制/移动赋值操作符。如果没有这些,您可能会发现对象共享底层数据,这通常是一个非常糟糕的想法。

但是,您应该记住,经验丰富的程序员更有可能使用C++语言/库的全部功能,而不是使用vector。它们比数组更具适应性,您的同事会认为您是一个真正的C++程序员,而不是一个C+程序员:-)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30250518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档