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.
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/
Dans le message 1103731329.453338.6270@z14g2000cwz.googlegroups.com,
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 mm@gdzid.com
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
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/
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.
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.
"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 ;)
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
Fabien LE LEZ <gramster@gramster.com> writes:
| On Wed, 22 Dec 2004 20:08:03 +0100, drkm <usenet.fclcxx@fgeorges.org>:
|
| > 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;
| 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
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
paris.s@laposte.net 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
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