14

クラスがあり、値が0、1、3、7、15、...のビットマスクが必要です。

したがって、基本的に、次のような定数intの配列を宣言したいと思います。

class A{

const int masks[] = {0,1,3,5,7,....}

}

しかし、コンパイラは常に文句を言います。

私は試した:

static const int masks[] = {0,1...}

static const int masks[9]; // then initializing inside the constructor

これをどのように行うことができるかについてのアイデアはありますか?

ありがとう!

4

5 に答える 5

29
class A {
    static const int masks[];
};

const int A::masks[] = { 1, 2, 3, 4, ... };

すでにクラス定義内で配列を固定したい場合がありますが、そうする必要はありません。配列は、定義の時点で完全な型になり(ヘッダーではなく、.cppファイル内に保持されます)、初期化子からサイズを推測できます。

于 2009-05-30T01:53:57.170 に答える
9
// in the .h file
class A {
  static int const masks[];
};

// in the .cpp file
int const A::masks[] = {0,1,3,5,7};
于 2009-05-30T01:56:33.030 に答える
2
enum Masks {A=0,B=1,c=3,d=5,e=7};
于 2009-05-30T01:49:48.457 に答える
2
  1. 変数を初期化できるのは、コンストラクターまたは他のメソッドのみです。
  2. 「静的」変数は、クラス定義から初期化する必要があります。

あなたはこれを行うことができます:

class A {
    static const int masks[];
};

const int A::masks[] = { 1, 2, 3, 4, .... };
于 2009-05-30T01:58:01.827 に答える
2

これは、メソッドを呼び出さずにプライベート メンバーを初期化できないためです。私は常にメンバー初期化リストを使用して、const および静的データ メンバーに対してこれを行います。

メンバー初期化子リストが何であるかわからない場合、それらはまさにあなたが望むものです。

このコードを見てください:

    class foo
{
int const b[2];
int a;

foo():    b{2,3}, a(5) //initializes Data Member
{
//Other Code
}

}

また、GCCにはこのクールな拡張機能があります:

const int a[] = { [0] = 1, [5] = 5 }; //  initializes element 0 to 1, and element 5 to 5. Every other elements to 0.
于 2014-03-04T04:19:07.120 に答える