[C++] problème membre statique

problème membre statique [C++] - C++ - Programmation

Marsh Posté le 11-08-2004 à 14:51:39    


J'ai un probleme avec ce code :
 

Code :
  1. #include <iostream.h>
  2. class complexe
  3. {
  4.         int i;
  5. int r;
  6. public:
  7. static int compteur;
  8. complexe(int a=0, int b=0)
  9. {
  10.  cout<<"Constructeur de complexe"<<endl;
  11.  r=a;
  12.  i=b;
  13.  compteur++;
  14.  cout<<"reel : "<<r<<"  imaginaire : "<<i<<endl;
  15. }
  16. ~complexe()
  17. {
  18.  cout<<"Destructeur de complexe"<<endl;
  19.  cout<<"reel : "<<r<<" imaginaire : "<<i<<endl;
  20.  compteur--;
  21. }
  22. //int complexe::compteur;
  23. };
  24. void main()
  25. {
  26. complexe c1;
  27. complexe c2(1,2);
  28. complexe c3(4,7);
  29. }


 
 
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 ?

Code :
  1. //int complexe::compteur;

 
 
 
Merci.

Reply

Marsh Posté le 11-08-2004 à 14:51:39   

Reply

Marsh Posté le 11-08-2004 à 14:55:54    

int complexe::compteur = 4;


Message édité par Taz le 11-08-2004 à 14:59:16
Reply

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.

Reply

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 :
  1. int complexe::compteur = DEFAULT_VAL;

entre la classe et le main

Reply

Marsh Posté le 11-08-2004 à 15:06:25    

dans le classe.c

Reply

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...)

Reply

Marsh Posté le 11-08-2004 à 15:15:44    

bah je fatigue :o

Reply

Marsh Posté le 11-08-2004 à 15:21:45    

jesus_christ a écrit :


Code :
  1. int complexe::compteur = DEFAULT_VAL;

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.  

Reply

Marsh Posté le 11-08-2004 à 15:21:52    

ça arrive qd on passe sa vie sur un forum :D

Reply

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.

Reply

Marsh Posté le 11-08-2004 à 15:24:16   

Reply

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 ?

Reply

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 ;)

Reply

Marsh Posté le 11-08-2004 à 17:13:29    

jesus_christ a écrit :


Ca peut marcher mais c'est pas propre (tout est inline...)


 
A mon tour de poser des questions cons  :D
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 ?  :??:

Reply

Marsh Posté le 11-08-2004 à 17:33:38    

on définit un corps, on déclare un prototype.

Reply

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" ?  

Reply

Marsh Posté le 11-08-2004 à 18:55:27    

oui

Reply

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


Message édité par jesus_christ le 12-08-2004 à 09:45:36
Reply

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

Reply

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 :jap:


Message édité par jesus_christ le 12-08-2004 à 11:32:02
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed