web-dev-qa-db-ja.com

C ++で定数配列を作成する

コードブロックが配列を作成できないと言っている理由はありますか?私は単にやろうとしています:

const unsigned int ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};

そしてそれは私に与えている

エラー:括弧で囲まれた初期化子は、「{」トークンの前では許可されていません

イニシャライザの他の部分を変更しましたが、エラーは常に同じことを言っています。これはc ++で最初に学んだことの1つであるため、意味をなさないようです。

37
hotdiggadydang

あなたはプライベート変数として、クラス内でこれをしたと言います。

(現時点では)メンバー変数初期化されていない可能性がありますを宣言した場所と同じ場所で(いくつかの例外を除いて)思い出してください。

struct T {
   std::string str = "lol";
};

大丈夫ではありません。次のようにする必要があります。

struct T {
   std::string str;
   T() : str("lol") {}
};

しかし、傷害にto辱を加えるために、C++ 0xより前では、ctor-initializer!の配列を初期化できません。

struct T {
   const unsigned int array[10];
   T() : array({0,1,2,3,4,5,6,7,8,9}) {} // not possible :(
};

また、配列の要素はconstであるため、代入にも依存できません。

struct T {
   const unsigned int array[10];
   T() {
       for (int i = 0; i < 10; i++)
          array[i] = i; // not possible :(
   }
};

ただし、他の一部の貢献者がまったく正しく指摘しているように、要素を変更できない場合は、Tの各インスタンスの配列のコピーを保持してもほとんど意味がありません。代わりに、staticメンバーを使用できます。

したがって、次の方法は最終的に、おそらく最良の方法で問題を解決します。

struct T {
   static const unsigned int array[10];
};

const unsigned int T::array[10] = {0,1,2,3,4,5,6,7,8,9};

お役に立てれば。

これは(コメントによれば)クラスのプライベートメンバー変数であるため、C++ 03では実際に許可されていません。

最新の多くのコンパイラで部分的にサポートされているC++ 0xでは、次のものをコンパイルできます。

class C
{
    const unsigned int ARRAY[10];
 public:
    C() : ARRAY{0,1,2,3,4,5,6,7,8,9} {}
};
int main()
{
    C obj; // contains a non-static const member: non-assignable 
}

ただし、非静的constメンバーは、クラスの異なるインスタンスにdifferent値が含まれている場合にのみ意味を持ちます。すべてのインスタンスに同じ{0,1,2,3,4,5,6,7,8,9}を含める場合は、staticにする必要があります。これにより、C++ 98でもこれを行うことができます。

class C
{
    static const unsigned int ARRAY[10];
 public:
    C() {}
};
const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};
int main()
{
    C obj;
}
7
Cubbi