Initialiser les variables statiques de la classe C++?
J'ai remarqué que certains de mes fonctions dans une classe ne sont pas réellement l'accès à l'objet, donc j'ai fait les static
. Ensuite, le compilateur me dit que toutes les variables de leur accès doit également être statique – eh bien, tout à fait compréhensible jusqu'à présent. J'ai un tas de variables de chaîne de caractères comme
string RE_ANY = "([^\\n]*)";
string RE_ANY_RELUCTANT = "([^\\n]*?)";
et ainsi de suite dans la classe. J'ai ensuite fait tous static const
parce qu'ils ne changent jamais. Cependant, mon programme ne compile que si je les déplacer hors de la classe: dans le cas Contraire, MSVC++2010 se plaint "Seulement statique constante intégrale variables peuvent être initialisées dans une classe".
Eh bien, c'est malheureux. Est-il une solution? Je voudrais les laisser à l'intérieur de la classe à laquelle ils appartiennent.
Vous devez vous connecter pour publier un commentaire.
Ils ne peuvent pas être initialisées à l'intérieur de la classe, mais ils peuvent être initialisés à l'extérieur de la classe, dans un fichier source:
Mise à jour
J'ai juste remarqué la première ligne de votre question, vous ne pas vous voulez rendre ces fonctions
static
, vous voulez faireconst
. Rendantstatic
signifie qu'ils ne sont plus liés à un objet (donc ils ne peuvent pas accéder à tout les membres non statiques), et de rendre les données statiques signifie qu'il sera partagé avec tous les objets de ce type. Cela peut ne pas être ce que vous voulez. Rendantconst
signifie simplement qu'ils ne peuvent pas modifier tous les membres, mais il peut toujours y avoir accès.const
etstatic
.const
signifie qu'il ne modifie pas lathis
... et il n'y a pas dethis
pourstatic
méthodes.static
est la bonne.static
etconst
ici: L'OP a dit, qu'il astatic
fonctions, que l'utilisationstatic const
valeurs. Si ses valeurs sont à la foisstatic
ETconst
, et qui est clairement le cas de l'initialisation au moment de la compilation est le plus important.string
en face de la Chose::RE_ANY " j'ai remarqué que l'on peut aussi faire de la corde(la Chose::RE_ANY) et cela fonctionne....pourquoi?string
parce que c'est une définition de variable, qui a besoin d'un spécificateur de type, et le type eststring
. Vous pouvez mettre()
autour d'un jugement de nullité, si vous voulez, cela ne change pas le sens.RE_ANY
et maintenant, nous voulons l'initialiser?Mike Seymour vous a donné la bonne réponse, mais à ajouter...
C++ permet de déclarer et définir dans votre corps de classe seulement static const types intégraux, comme le compilateur dit. De sorte que vous pouvez réellement faire:
Et vous ne pouvez pas le faire avec n'importe quel autre type, dans ce cas, vous devez les définir dans votre .fichier cpp.
Membre statique les variables doivent être déclarées dans la classe et ensuite définie en dehors de ça!
Il n'y a pas de solution, il suffit de mettre leur définition dans un fichier source.
À partir de votre description, il sent que vous n'êtes pas à l'aide de variables statiques de la bonne façon. Si ils ne changent jamais, vous devez utiliser la constante variable au lieu de cela, mais votre description est trop générique pour dire quelque chose de plus.
Membre statique des variables, maintenez toujours la même valeur pour toute instance de votre classe: si vous modifiez une variable statique d'un objet, il va changer aussi pour tous les autres objets (et en fait, vous pouvez aussi y accéder sans une instance de la classe - c'est à dire: un objet).
extern
les variables définies dans d'autres fichiers source.struct A { static int x; };
, et vous essayez d'accéder àA::x
sans définirint A::x;
dans un fichier source, votre code ne sera pas le lien.struct A { static int x = 5; };
et la définition de la classe serait alors juridiques.A::x
(A::x=0;
). Va MSVC compiler?static const int x = 5
Depuis C++11, il peut être fait à l'intérieur d'une classe avec
constexpr
.La variable peut maintenant être accédé avec:
constexpr char RE_ANY[] = "([^\\n]*)";
ouconstexpr std::string_view RE_ANY("([^\\n]*)", 9);
.Je pense qu'il est utile d'ajouter que si une variable statique n'est pas le même comme une constante variable.
à l'aide d'une constante variable dans une classe
et nous le déclarer comme comme
Pour une variable statique
qui est utilisé comme
Vous voyez ce qui se passe ici. La constante de la variable, qui est instanciée avec chaque instance de Toto, que Foo est instanciée a une valeur distincte pour chaque instance de Toto, et il ne peut pas être modifié par Toto à tous.
Où, comme avec le Bar, la leur est seule valeur pour le Bar::un peu importe combien d'instances de Bar sont faites. Ils partagent tous cette valeur, vous pouvez aussi y accéder avec leur toutes les instances de la Barre. La variable statique respecte aussi les règles pour le public/privé, de sorte que vous pouvez le faire que seules les instances de Bar peut lire la valeur de la Barre::a;
new
. 😉Juste à ajouter sur le dessus de l'autre des réponses. Pour initialiser un complexe membre statique, vous pouvez le faire comme suit:
Déclarer votre membre statique comme d'habitude.
Faire une petite fonction pour initialiser votre classe, si il n'est pas trivial de le faire. Ce sera juste le temps que le membre statique est initialisé. (Notez que le constructeur de copie de complexClass sera utilisé, il doit être bien défini).
Si votre but est d'initialiser la variable statique dans votre fichier d'en-tête (au lieu d'un *.fichier cpp, qui pourrait vous intéresser si vous vous en tenez à un "en-tête seulement" l'idiome), alors vous pouvez contourner le problème d'initialisation à l'aide d'un modèle. Basé sur un modèle statique des variables peuvent être initialisées dans un en-tête, sans provoquer de multiples symboles être défini.
Voir ici pour un exemple:
Membre statique d'initialisation dans un modèle de classe
Éventuellement, de déplacer tous vos constantes .fichier cpp sans déclaration .h fichier. L'utilisation anonyme de l'espace de noms pour les rendre invisibles au-delà de la rpc module.
Certaines réponses semblent être trompeuse un peu.
Vous n'avez pas à
.cpp
fichier pour l'initialiser, Il peut être fait la même juste dans la en-Tête fichier.