OVH Cloud OVH Cloud

Initialisation de donnée membre static

14 réponses
Avatar
MGN
Bonjour,
j'ai une classe avec une présentation classique :
- déclarations dans le fichier hpp
- définitions dans le fichier cpp

je me pose la question de la différence entre une variable globale définie
comme suit :
dans cpp :
vector<std::string> x;
et la même chose en tant que membre static private d'une classe
(c'est juste une variable utilisée fréquemment dans certaines méthodes (je
programme un interpréteur))

Dans les deux cas, je ne sais pas comment l'initialiser, excepté dans le
corps du constructeur de la classe qui peut tester si la liste est vide...
Mais je trouve cette solution pas très élégante.
Je veux l'initialiser avec une liste de mots.

est-ce que je peux écrire simplement dans le fichier cpp.
vector<std::string> x;
x.push_back("mot1");
x.push_back("mot2");
etc...

Dans ce cas, quand ce bout de code est exécuté ? (je me pose cette question
parce que ça marche avec mon compilateur, mais que ça me paraît dangeureux
!)

Merci pour vos conseils
Marc

4 réponses

1 2
Avatar
kanze
Michel Decima wrote:

Pareil, évidemment, si l'objet est un membre statique (sauf
qu'il se nomme alors C::x, et non simplement x).

Sinon, tu peux aussi écrire :

static void initX() ;
std::vector< std::string > x ;
static bool dummy = (initX(), true) ;

void initX()
{
x.push_back( "mot1" ) ;
x.push_back( "mot2" ) ;
}


Il y a une raison particuliere qui justifie l'operateur , dans
l'initialisation de dummy, plutot qu'un initX() qui retourne
un bool ?


Pas vraiment, sinon que dans ce cas-ci, ça tire un peu plus
d'attention sur le fait que la valeur d'initialisation n'a
aucune signification. (Autre qu'à indiquer que l'initialisation
a bien eu lieu.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
kanze
MGN wrote:
Sinon, tu peux aussi écrire :

static void initX() ;
std::vector< std::string > x ;
static bool dummy = (initX(), true) ;

Tu n'as pas oublié static devant
std::vector< std::string > x ;
?
Ou tu utilises une variable globale.


Je l'utilise plutôt comme une variable globale. Où j'ai mis les
static, ce sont des variables qui ne servent qu'à
l'initialisation, ici.

Désolé, je comprends pas tout...


Précise ce que tu ne comprends pas, et on essaiera de
l'éclairer. Les conceptes en question sont assez simples, mais
ils se réposent bien sur des règles C++ qu'on ne connaît pas
forcement d'office.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Michel Decima
Michel Decima wrote:

Sinon, tu peux aussi écrire :

static void initX() ;
std::vector< std::string > x ;
static bool dummy = (initX(), true) ;

void initX()
{
x.push_back( "mot1" ) ;
x.push_back( "mot2" ) ;
}


Il y a une raison particuliere qui justifie l'operateur , dans
l'initialisation de dummy, plutot qu'un initX() qui retourne
un bool ?


Pas vraiment, sinon que dans ce cas-ci, ça tire un peu plus
d'attention sur le fait que la valeur d'initialisation n'a
aucune signification. (Autre qu'à indiquer que l'initialisation
a bien eu lieu.)


Ok, je vois l'idee. J'aurais choisi la version qui retourne un bool pour
eviter l'usage de l'operator, qui n'est pas toujours lisible et/ou
comprise par la suite, mais ca ne simplifie pas vraiment la
comprehension puisque ca deporte le probleme dans initX().



Avatar
kanze
Michel Decima wrote:
Michel Decima wrote:

Sinon, tu peux aussi écrire :

static void initX() ;
std::vector< std::string > x ;
static bool dummy = (initX(), true) ;

void initX()
{
x.push_back( "mot1" ) ;
x.push_back( "mot2" ) ;
}


Il y a une raison particuliere qui justifie l'operateur ,
dans l'initialisation de dummy, plutot qu'un initX() qui
retourne un bool ?


Pas vraiment, sinon que dans ce cas-ci, ça tire un peu plus
d'attention sur le fait que la valeur d'initialisation n'a
aucune signification. (Autre qu'à indiquer que
l'initialisation a bien eu lieu.)


Ok, je vois l'idee. J'aurais choisi la version qui retourne un
bool pour eviter l'usage de l'operator, qui n'est pas toujours
lisible et/ou comprise par la suite,


C'est ce que je fais dans la production (où souvent, les règles
de codage interdisent l'utilisation de l'operator,()). C'est
dans la contexte de la réponse ici que j'ai fait autrement, pour
tirer l'attention sur l'idée que la fonction n'était pas là pour
sa valeur de retour, mais bien pour ses effets ailleurs.

mais ca ne simplifie pas
vraiment la comprehension puisque ca deporte le probleme dans
initX().


Quelque soit l'écriture adoptée, un commentaire s'impose.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34




1 2