web-dev-qa-db-fra.com

Initialisation d'un tableau statique constant dans un fichier d'en-tête

Je viens de découvrir que ce qui suit n'est pas valide.

//Header File
class test
{
    const static char array[] = { '1', '2', '3' };
};

Quel est le meilleur endroit pour initialiser cela?

36
user174084

Le meilleur endroit serait dans un fichier source

// Header file
class test
{
    const static char array[];
};

// Source file
const char test::array[] = {'1','2','3'};

Vous pouvez initialiser des types entiers dans la déclaration de classe comme vous avez essayé de le faire; tous les autres types doivent être initialisés en dehors de la déclaration de classe, et une seule fois.

49
Mike Seymour

Vous pouvez toujours effectuer les opérations suivantes:

class test {
  static const char array(int index) {
    static const char a[] = {'1','2','3'};
    return a[index];
  } 
};

Quelques belles choses sur ce paradigme:

  • Pas besoin de fichier cpp
  • Vous pouvez faire une vérification de plage si vous le souhaitez
  • Vous évitez d'avoir à vous soucier du fiasco d'initialisation statique
30
JKD
//Header File 
class test 
{ 
    const static char array[];
}; 

// .cpp
const char test::array[] = { '1', '2', '3' }; 
20
peterchen

Maintenant, en C++ 17, vous pouvez utiliser la variable inline

Comment fonctionnent les variables en ligne?

Un simple membre de données statiques ( N4424 ):

struct WithStaticDataMember {
  // This is a definition, no out­of­line definition is required.
  static inline constexpr const char *kFoo = "foo bar";
};

Dans votre exemple:

//Header File
class test
{
    inline constexpr static char array[] = { '1', '2', '3' };
};

devrait juste fonctionner

6
lz96