【问题标题】:error: invalid use of non-static data member错误:非静态数据成员的使用无效
【发布时间】:2015-06-26 08:42:55
【问题描述】:
class Stack
{               
private:

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

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

错误:非静态数据成员“max”的使用无效

代码有什么问题,请帮助我进行正确的更正。 谢谢你

【问题讨论】:

    标签: c++ arrays compiler-errors


    【解决方案1】:

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

    如果您使用的是 C++11,constexpr 是一个很好的关键字,它是专门为此目的而设计的。

    constexpr int max = 10;
    

    如果您还没有 C++11,请使用 static 使其成为其他人指出的编译时间常数。

    【讨论】:

    • 即使在 c++11 中,我认为你也不能只使用 constexpr。您将不得不使用 static constexpr int max = 10。
    【解决方案2】:

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

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

    static const int max = 10;
    

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

    【讨论】:

      【解决方案3】:

      正如编译器所说,将数据成员设为静态

      static const int max = 10;    
      

      【讨论】:

        【解决方案4】:

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

        static const int max = 10;
        

        【讨论】:

        • 不是所有的编译器都支持,必须在头文件中设置static const int max;,在cpp文件中设置const int Stack::max = 10;
        • @tejashs:max 的定义也必须出现在标题中。
        • 如果你有一个坏/旧的编译器,你也可以去inline static const int max(){return 10; }
        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-13
          • 2016-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多