3

私は変数を自分のクラスのプライベートでadc_cmd[9]として定義しています。それは定数なので、それ自体をクラス内で定義するだけだと思っていましたが、明らかにうまくいきませんでした: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];
};

1つの.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

2 つを組み合わせる:

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の答えに貢献するためだけに:

staticC++ では、修飾子が確かに少し紛らわしいことを指摘しておく必要があります。私の知る限りでは、使用される場所に応じて 3 つの異なることを行います。

  1. クラス メンバー属性の前: この属性を、そのクラスのすべてのインスタンスで同じにします (Java と同じ)。
  2. グローバル変数の前: 変数のスコープを現在のソース ファイルのみに縮小します (C と同じ)。
  3. メソッド / 関数内のローカル変数の前: この変数を、そのメソッド / 関数へのすべての呼び出しに対して同じにします (C と同じで、シングルトン デザイン パターンに役立つ場合があります)。
于 2012-04-03T22:11:14.020 に答える