【问题标题】:Trying to define a static constant variable in a class试图在一个类中定义一个静态常量变量
【发布时间】:2012-04-17 14:15:50
【问题描述】:

我在我的类ADC 中将变量adc_cmd[9] 定义为static const unsigned char 私有下。由于它是一个常量,我想我会在它自己的类中定义它,但这显然不起作用:

#pragma once

class ADC{
private:
    static const unsigned char adc_cmd[9] = { 0x87, 0xC7, 0x97, 0xD7, 0xA7, 0xE7, 0xB7, 0xF7, 0x00 };
//...
};

错误:

error: a brace-enclosed initializer is not allowed here before '{' token
error: invalid in-class initialization of static data member of non-integral type 'const unsigned char [9]'

...

所以我尝试使用static const unsigned char ADC::adc_cmd[9] = { 0x87, 0xC7, 0x97, 0xD7, 0xA7, 0xE7, 0xB7, 0xF7, 0x00 }; 将这条线带出课堂,但这产生了这个错误:

error: 'static' may not be used when defining (as opposed to declaring) a static data member
error: 'const unsigned char ADC::adc_cmd [9]' is not a static member of 'class ADC'

我显然没有正确声明这一点。声明这个的正确方法是什么?

【问题讨论】:

    标签: c++ class static


    【解决方案1】:

    你在类体内声明它:

    class ADC{
    private:
        static const unsigned char adc_cmd[9];
    //...
    };
    

    定义(并在外部初始化)它(只要一次,对于任何外部链接定义):

    const unsigned char ADC::adc_cmd[9] = { 0x87, 0xC7, 0x97, 0xD7, 0xA7, 0xE7, 0xB7, 0xF7, 0x00 };
    

    不写static,由错误消息指定。

    (不要问我为什么这里禁止static,我总是发现各种“重复限定符”规则完全不合逻辑)

    【讨论】:

      【解决方案2】:

      在 C++03 中,静态数据成员定义位于类定义之外

      标题:

      #pragma once
      
      class ADC {
      private:
          static unsigned char const adc_cmd[9];
      };
      

      一个.cpp文件中:

      #include "headername"
      
      unsigned char const ADC::adc_cmd[9] = { 0x87, 0xC7, 0x97, 0xD7, 0xA7, 0xE7, 0xB7, 0xF7, 0x00 };
      

      【讨论】:

        【解决方案3】:

        将两者结合起来:

        class ADC{
        private:
            static const unsigned char adc_cmd[9];
            //...
        };
        
        //.cpp
        const unsigned char ADC::adc_cmd[9] = { 0x87, 0xC7, 0x97, 0xD7, 0xA7, 0xE7, 0xB7, 0xF7, 0x00 };
        

        【讨论】:

          【解决方案4】:

          只是为了帮助 Matteo 的回答:

          我们必须指出,static 限定符在 C++ 中确实有点令人困惑。据我所知,它会根据使用的位置做三件不同的事情:

          1. 在类成员属性前面:使该类的所有实例的该属性相同(与 Java 相同)。
          2. 在全局变量前面:将变量的范围缩小到仅当前源文件(与 C 相同)。
          3. 在方法/函数中的局部变量前面:使该变量对于对该方法/函数的所有调用都相同(与 C 相同,可能对单例设计模式有用)。

          【讨论】:

            【解决方案5】:

            C++11 开始,在这种情况下(当您有静态 const LiteralType 时)您可以做的是使用 constexpr,使该值成为有保证的编译时常量。

            那就是:

            #pragma once
            
            class ADC{
            private:
                static constexpr unsigned char adc_cmd[9] = { 0x87, 0xC7, 0x97, 0xD7, 0xA7, 0xE7, 0xB7, 0xF7, 0x00 };
            //...
            };
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-03-15
              • 2012-02-19
              • 1970-01-01
              相关资源
              最近更新 更多