【问题标题】:error: invalid use of non-static data member 'capacity' int data[capacity];错误:无效使用非静态数据成员“容量”int data[容量];
【发布时间】:2015-05-15 02:21:27
【问题描述】:

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

#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;    
}

【问题讨论】:

  • kalkid,只是出于兴趣,如果您不允许使用向量(根据您的 cmets 之一),为什么您的代码中有 #include &lt;vector&gt;? :-) 并确保您理解,除非设置了 NDEBUG,否则断言没有任何好处。它们非常适合在开发过程中发现问题(或家庭作业),但对于健壮的代码,它们并不是最好的。
  • @paxdiablo 不是反过来吗,即#define NDEBUG 禁用断言?
  • @vsoftco,抱歉,你是对的。这只是表明我使用了多少断言:-)

标签: c++


【解决方案1】:

标准 C++ 中不允许使用可变长度数组。使用动态数组,或者更好,std::vector&lt;int&gt; 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&lt;int&gt;

【讨论】:

  • in b4 "但是我的作业说禁止使用向量"
  • 还要想想int capacity;int data[capacity]; 的含义:数据的大小是根据容量确定的,而容量可能还没有被赋予任何值。
【解决方案2】:
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+ 程序员 :-)

【讨论】:

    猜你喜欢
    • 2015-06-26
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多