Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

variable static non const dans une classe

18 réponses
Avatar
paris.s
Bonjour,

J'ai cherche sur le web et n'ai pas trouve de reponse a ce probleme.

J'ai quelque chose sur le modele:

--- toto.h:

class Toto{
//...

private:
static unsigned var;
};

unsigned Toto::var = 18;

--- fin de toto.h


Le probleme est quand j'inclus toto.h dans plusieurs fichiers .cc qui
sont compiles separement et donnent lieu a plusieurs fichiers .o, au
moment du lien, j'ai une erreur:

multiple definition of 'Toto::var'
first defined in...


Ca semble un probleme classique, qui doit avoir une reponse classique.
Peut-etre dois-je creer un fichier .cc juste pour cette variable --
mais ca serait dommage, j'aimerai bien garde le tout sous forme
d'en-tete car tout le reste est soit inline soit template. Si je peux
eviter de faire une bibliotheque juste pour ca, ca m'arrangerait.

J'utilise: g++ (GCC) 3.2.3 20030502 (Red Hat Linux 3.2.3-42)
Si vous avez une reponse, j'en serai bien content.

Sylvain

8 réponses

1 2
Avatar
Michel Michaud
Dans le message ,
Les variables 'static' qui apparaissent son les reglages generaux
de la transformee de Fourier:
- un drapeau pour dire comment choisir la methode de calcul,
- le nom du fichier ou sont enregistrees des infos pour faire ce
choix plus rapidement,
- le nombre d'instances que j'ai en cours pour ne lire le fichier
precedent que la premiere fois et pour enregistrer un nouveau
fichier une fois la derniere instance detruite.

Et mon souhait est toujours d'eviter d'avoir a manipuler une
bibliotheque juste pour trois lignes d'initialisation de variables
'static'.


Alors la technique des pseudo-singleton devrait suffire.

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Alexandre
bonjour,


class Toto{
//...

private:
static unsigned var;
};

unsigned Toto::var = 18;


à mettre dans le .cpp, pas dans le .h. Comme ça tu n'auras qu'une seule
déclaration.

Avatar
drkm
Fabien LE LEZ writes:

On Tue, 21 Dec 2004 23:26:44 -0500, "Michel Michaud" :

class Toto{
private:
static unsigned& Var()
{
static unsigned valeur= 18;
return valeur;


Pour le coup, je veux bien que tu m'expliques comment ça marche, quand
le header est #inclus dans plusieurs .cpp.


ODR ?

Pour moi, il y a une variable "static unsigned valeur" par module, par
définition de "static".


Ceci te choque-t-il :

class A {
static int const i = 0 ;
} ;

?

--drkm


Avatar
Fabien LE LEZ
On Wed, 22 Dec 2004 20:08:03 +0100, drkm :

Ceci te choque-t-il :

class A {
static int const i = 0 ;
} ;


Non, puisque je sais qu'il y a dans un .cpp une ligne

int const A::i;


--
;-)

Avatar
drkm
Fabien LE LEZ writes:

On Wed, 22 Dec 2004 20:08:03 +0100, drkm :

Ceci te choque-t-il :

class A {
static int const i = 0 ;
} ;


Non, puisque je sais qu'il y a dans un .cpp une ligne

int const A::i;


Et s'il n'y en a pas ? Je trouverais d'ailleurs bizarre qu'il y en
ai une.

--drkm


Avatar
Christophe Lephay
"Alexandre" a écrit dans le message de news:
41c9ece8$0$31607$
unsigned Toto::var = 18;


à mettre dans le .cpp, pas dans le .h. Comme ça tu n'auras qu'une seule
déclaration.


Une seule définition, tu voulais dire ;)


Avatar
Gabriel Dos Reis
Fabien LE LEZ writes:

| On Wed, 22 Dec 2004 20:08:03 +0100, drkm :
|
| > Ceci te choque-t-il :
| >
| > class A {
| > static int const i = 0 ;
| > } ;
|
| Non, puisque je sais qu'il y a dans un .cpp une ligne
|
| int const A::i;

Pas forcément.

-- Gaby
Avatar
kanze
wrote:

Si je comprends, ce que je souhaite est me placer dans le cas (4): ne
garder qu'une seule des definitions vu que ce sont toutes les memes.
Y

a-t-il moyen de "suggerer" ce comportement?


Écrire ton propre compilateur:-).

La définition multiple d'une variable statique membre d'une classe non
templatée est une erreur en C++. Selon la norme, c'est un comportement
indéfini, mais dans la mésure qu'il y a une possibilité de detecter
l'erreur dans l'éditeur de liens, les implémenteurs de compilateur
préfère donner une erreur, plutôt que de nous laisser avec un
comportement indéfini sans dire rien. (La raison pour le comportement
indéfini, je crois, c'est parce que certains éditeurs de liens
anciens
ne supportaitent pas la possibilité 3.)

Je pourrais mettre un 'template' juste pour la forme mais ce ne me
semble pas tres "esthetique".


C'est le moindre qu'on puisse dire:-).

--
James Kanze GABI Software http://www.gabi-soft.fr
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