web-dev-qa-db-fra.com

faire un tableau constant en c ++

Y a-t-il une raison pour laquelle les blocs de code me disent que je ne peux pas créer un tableau? J'essaie simplement de faire:

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

et ça me donne

erreur: un initialiseur entre accolades n'est pas autorisé ici avant le jeton '{'

J'ai changé d'autres parties de l'initialiseur, mais l'erreur dit toujours la même chose. Cela ne semble pas logique, car c'est l'une des premières choses que j'ai apprises en c ++.

37
hotdiggadydang

Vous dites que vous l'avez fait au sein d'une classe, en tant que variable privée.

Rappelez-vous que (pour le moment), les variables membres ne peuvent pas être initialisées au même endroit où vous les déclarez (à quelques exceptions près).

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

n'est pas ok. Ce doit être:

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

Mais, pour ajouter l'insulte à la blessure, avant C++ 0x, vous ne pouvez pas initialiser les tableaux dans le ctor-initializer !:

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

Et, comme les éléments de votre tableau sont const, vous ne pouvez pas non plus vous fier à l'affectation:

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

Cependant, comme certains autres contributeurs l'ont souligné à juste titre, il semble inutile d'avoir une copie du tableau pour chaque instance de T si vous ne pouvez pas modifier ses éléments. À la place, vous pouvez utiliser un membre static.

Ainsi, ce qui suit résoudra votre problème de la meilleure façon - probablement -:

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

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

J'espère que cela t'aides.

Comme il s'agit d'une variable membre privée dans une classe (selon le commentaire), cela n'est en effet pas autorisé en C++ 03.

C++ 0x, partiellement pris en charge par de nombreux compilateurs modernes, permet de compiler les éléments suivants:

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 
}

Cependant, les membres const non statiques n'ont de sens que s'ils contiennent des valeurs different dans différentes instances de la classe. Si chaque instance doit contenir le même {0,1,2,3,4,5,6,7,8,9}, alors vous devriez le faire static, ce qui permet également de le faire en 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