535 votes

C++ statique de la chaîne constante (membre de la classe)

J'aimerais avoir une private static constante pour une classe (dans ce cas une forme à l'usine). J'aimerais avoir quelque chose de la sorte.

class A {
   private:
      static const string RECTANGLE = "rectangle";
}

Malheureusement je reçois toutes sortes d'erreur à partir du C++ (g++) compilateur, tels que:

ISO C++ forbids de l'initialisation de l' membre du "RECTANGLE"

invalide dans la classe d'initialisation de la donnée membre statique de non-intégré de type ‘std::string'

erreur: faire du "RECTANGLE" statique

Cela me dit que ce genre de membre de la conception n'est pas conforme à la norme. Comment faire vous avez une constante littérale (ou peut-être public) sans avoir à utiliser un #define directive (je veux éviter de le uglyness de données globalité!)

Toute aide est appréciée. Merci.

606voto

AndreyT Points 139512

Vous devez définir votre membre statique à l'extérieur de la définition de la classe et de fournir les initailizer.

Première

// In a header file (if it is in a header file in your case)
class A {   
private:      
  static const string RECTANGLE;
};

et puis

// In one of the implementation files
const string A::RECTANGLE = "rectangle";

La syntaxe ont été à l'origine d'essayer de les utiliser (initialiseur à l'intérieur de la définition de la classe) n'est autorisée qu'avec l'intégrale et les types d'énumérations.

184voto

abyss.7 Points 2540

En C++11, vous pouvez le faire maintenant:

class A {
 private:
  static constexpr const char* STRING = "some useful string constant";
};

34voto

sellibitze Points 13607

À l'intérieur des définitions de classe, vous ne pouvez déclarer des membres statiques. Ils doivent être définis en dehors de la classe. Pour la compilation intégrale des constantes de la norme à l'exception que vous pouvez "initialiser" les membres. Il n'est pas encore une définition, bien. En prenant l'adresse ne pourrait pas fonctionner sans définition, par exemple.

Je tiens à mentionner que je ne vois pas l'avantage de l'utilisation de std::string sur const char[] pour les constantes. std::string, c'est bien joli mais il nécessite de la dynamique de l'initialisation. Ainsi, si vous écrivez quelque chose comme

const std::string foo = "hello";

à l'espace de noms de champ d'application le constructeur de foo sera exécuté juste avant l'exécution de la principale commence et ce constructeur permet de créer une copie de la constante "bonjour" dans la mémoire de masse. À moins que vous vraiment besoin de RECTANGLE à un std::string vous pourriez tout aussi bien écrire

// class definition with incomplete static member could be in a header file
class A {
    static const char RECTANGLE[];
};

// this needs to be placed in a single translation unit only
const char A::RECTANGLE[] = "rectangle";

Il y! Aucune allocation de tas, pas de copie, pas de dynamique de l'initialisation.

Cheers, s.

15voto

GManNickG Points 155079

C'est juste une information supplémentaire, mais si vous voulez vraiment la chaîne dans un fichier d'en-tête, essayez quelque chose comme:

class foo
{
public:
    static const std::string& RECTANGLE(void)
    {
        static const std::string str = "rectangle";

        return str;
    }
};

Bien que je doute que c'est recommandé.

7voto

aJ. Points 17014

Pour l'utiliser en classe d'initialisation la syntaxe, la constante doit être statique const intégrale ou type d'énumération initialisé par une expression constante.

C'est la restriction. Donc, dans ce cas, vous devez définir la variable en dehors de la classe. reportez-vous answwer de @AndreyT

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X