error: invalid use of non-static data member

error: invalid use of non-static data member

class Stack
{               
private:

    int tos;
    const int max = 10;    
    int a[max];
public:

    void push(int adddata);
    void pop();
    void printlist();
};

错误:无效使用非静态数据成员'max'

代码有什么问题,请帮我更正。 谢谢

正如编译器所说,使数据成员成为静态的

static const int max = 10;    

您需要将 max 设为编译时间常量:

static const int max = 10;

如错误所说,max是Stack的非静态成员;因此您只能将其作为 Stack 对象的一部分进行访问。您正在尝试访问它,就好像它是一个静态成员一样,它独立于任何对象而存在。

因此您需要将其设为静态。

static const int max = 10;

如果初始化在头文件中,那么每个包含头文件的文件都会有一个静态成员的定义。因此在 link 阶段你会得到 linker 错误,因为初始化变量的代码将在多个源文件中定义。

对于非堆分配(不使用 new 分配内存),必须在编译时知道数组大小。

如果您使用的是 C++11,constexpr 是一个很好的关键字,它是专门为此目的而设计的。 [编辑:正如@bornfree 在评论中指出的那样,它仍然需要是静态的]

static constexpr int max = 10;

因此,使用 static 使其成为其他人指出的编译时间常量。

您犯的概念错误是您试图在 class 定义中初始化 class 的值。这就是构造函数存在的原因。使用参数化构造函数设置值栈顶及其大小。 当使栈对象传递要创建的栈的大小时:

class Stack {               
private:
  int tos; 
  int a[max];

public:
  Stack(int s);
  void push(int adddata);
  void pop();
  void printlist();
};

Stack::Stack(int s) {
  tos=-1;
  max=s;
}