problème membre statique [C++] - C++ - Programmation
Marsh Posté le 11-08-2004 à 14:55:54
int complexe::compteur = 4;
Marsh Posté le 11-08-2004 à 15:02:24
Taz a écrit : int complexe::compteur = 4; |
Merci
Mais j'ai toujour l'erreur de link et je vois pas du tout ce que c'est.
Marsh Posté le 11-08-2004 à 15:05:17
un membre static doit être redéclaré à l'extérieur de la classe en C++ pour qu'il se voit alloué contrairement en Java.
Ici il est déclaré mais pas alloué, d'où l'erreur de link.
rajoute un :
Code :
|
entre la classe et le main
Marsh Posté le 11-08-2004 à 15:10:35
Taz a écrit : dans le classe.c |
dans le classe.cpp plutôt, l'opérateur :: n'est pas reconnu en C.
manson : en C++ c'est mieux de faire la déclaration de la classe dans un .h et le code dans un .cpp
là tu codes comme en Java on dirait. Ca peut marcher mais c'est pas propre (tout est inline...)
Marsh Posté le 11-08-2004 à 15:21:45
jesus_christ a écrit :
entre la classe et le main |
oui c'était bien ca.
Je fais la déclaration de la classe dans un .h et le code dans un .cpp mais la c'était pour testé car ca marchais pas.
Merci.
Marsh Posté le 11-08-2004 à 15:24:16
manson69 a écrit : oui c'était bien ca. |
le contraire aurait été très anormal. Je t'ai répondu car à mes débuts en C++ j'ai du perdre 1h sur ce truc. C'est vrai que si techniquement c'est justifié (un .h n'est pas directement compilé) c'est étrange comme syntaxe.
Marsh Posté le 11-08-2004 à 15:32:51
jesus_christ a écrit : un membre static doit être redéclaré à l'extérieur de la classe en C++ |
c'est pas plutot parce qu'il doit etre definis vu que static ... n'est qu'une declaration ?
Marsh Posté le 11-08-2004 à 17:06:32
oui défini, je préfère dire "redéclarer" pour un attribut et "definir" pour une fonction ou une méthode, mais ce n'est qu'une question de langage.
au passage manson sache que l'attribut statique déclaré dans la classe, donc dans le MaClasse.h peut être redéclaré (ou défini) dans n'importe quel .cpp, pas forcément le MaClasse.cpp
Ca parraîtra évident à la plupart des gens mais on sait jamais
Marsh Posté le 11-08-2004 à 17:13:29
jesus_christ a écrit : |
A mon tour de poser des questions cons
C'est vrai ca, que si on déclare le corps de la méthode dans la définition de la classe, elle sont inlinées ?
Marsh Posté le 11-08-2004 à 18:54:19
Taz a écrit : on définit un corps, on déclare un prototype. |
Bon, d'accord j'ai mélangé les termes.... (:pfff
Je reprends :
Est-ce vrai que si on définit le corps de la méthode dans la déclaration de la classe, la méthode est "inlinée" ?
Marsh Posté le 12-08-2004 à 09:42:54
... mais ça dépend du compilo
Le standard du C++ dit ça, mais il dit aussi que le compilo peut choisir de inliner ou pas une méthode.
En règle générale ton compilo te donne le choix :
- inliner ce que le C++ te dit de inliner
- inliner ce que le compilo trouve pertinent (généralement méthode courte avec un seul return, genre les GetAttibut(void)
- ne rien inliner
dans le dernier cas, je vais me répéter, mais ça compile comme en Java et t'as pas à te soucier de ça.
reste que c'est plus propre de ne mettre que le proto dans la classe. Moi perso je ne mets que les méthodes vides (genre destructeur de classe triviale) dans la classe
Marsh Posté le 12-08-2004 à 09:55:02
oui mais ça on s'en fout. la déclaration 'inline' dans le bloc de classe à la même signification que le mot-clef 'inline'. Que ça soit réellement inliné ou pas, ça n'est pas du tout le problème. Tous les compilos te garantissent la sémantique de inline, qu'ils optimisent ou pas : en gros du n'aura pas de problème de définition multiple comme si tu mettais le corps d'une fonction directement dans ton .h. C'est ça l'important, le reste, ça n'est que des 'indications'. Le C++ est très souple et impose peut de choses en terme d'implémentation
Marsh Posté le 12-08-2004 à 11:31:25
Taz a écrit : en gros du n'aura pas de problème de définition multiple comme si tu mettais le corps d'une fonction directement dans ton .h |
tiens c'est pas con ça, je me demandais pkoi ils avaient imposé cette règle du inline : pour éviter les définitions multiples. J'y avais jamais pensé !
j'ai appris un truc aujourd'hui
Marsh Posté le 11-08-2004 à 14:51:39
J'ai un probleme avec ce code :
Voila l'erreur que j'ai :
Linking...
main.obj : error LNK2001: unresolved external symbol "public: static int complexe::compteur" (?compteur@complexe@@2HA)
Debug/statique.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
statique.exe - 2 error(s), 0 warning(s)
Le compteur est initialisé à 0 par défaut ?
Pour l'initialisé à une autre valeur, il faut faire comme ça ?
Merci.