3

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

#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'

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

4

5 回答 5

5

在 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 };
于 2012-04-03T21:18:42.133 回答
5

你在类体内声明它:

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被禁止,我总是发现各种“重复限定词”规则完全不合逻辑)

于 2012-04-03T21:20:11.350 回答
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 };
于 2012-04-03T21:20:11.303 回答
2

只是为了帮助 Matteo 的回答:

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

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

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

那将是:

#pragma once

class ADC{
private:
    static constexpr unsigned char adc_cmd[9] = { 0x87, 0xC7, 0x97, 0xD7, 0xA7, 0xE7, 0xB7, 0xF7, 0x00 };
//...
};
于 2021-11-17T00:56:45.667 回答