Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1925 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] problème membre statique

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] problème membre statique

n°820331
manson69
Posté le 11-08-2004 à 14:51:39  profilanswer
 


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.

mood
Publicité
Posté le 11-08-2004 à 14:51:39  profilanswer
 

n°820333
Taz
bisounours-codeur
Posté le 11-08-2004 à 14:55:54  profilanswer
 

int complexe::compteur = 4;


Message édité par Taz le 11-08-2004 à 14:59:16
n°820339
manson69
Posté le 11-08-2004 à 15:02:24  profilanswer
 

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.

n°820342
jesus_chri​st
votre nouveau dieu
Posté le 11-08-2004 à 15:05:17  profilanswer
 

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

n°820343
Taz
bisounours-codeur
Posté le 11-08-2004 à 15:06:25  profilanswer
 

dans le classe.c

n°820345
jesus_chri​st
votre nouveau dieu
Posté le 11-08-2004 à 15:10:35  profilanswer
 

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

n°820346
Taz
bisounours-codeur
Posté le 11-08-2004 à 15:15:44  profilanswer
 

bah je fatigue :o

n°820349
manson69
Posté le 11-08-2004 à 15:21:45  profilanswer
 

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.  

n°820350
jesus_chri​st
votre nouveau dieu
Posté le 11-08-2004 à 15:21:52  profilanswer
 

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

n°820351
jesus_chri​st
votre nouveau dieu
Posté le 11-08-2004 à 15:24:16  profilanswer
 

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.

mood
Publicité
Posté le 11-08-2004 à 15:24:16  profilanswer
 

n°820354
cris56
Posté le 11-08-2004 à 15:32:51  profilanswer
 

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 ?

n°820500
jesus_chri​st
votre nouveau dieu
Posté le 11-08-2004 à 17:06:32  profilanswer
 

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

n°820509
oliv5
Pourquoi ? Parce que !
Posté le 11-08-2004 à 17:13:29  profilanswer
 

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

n°820527
Taz
bisounours-codeur
Posté le 11-08-2004 à 17:33:38  profilanswer
 

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

n°820635
oliv5
Pourquoi ? Parce que !
Posté le 11-08-2004 à 18:54:19  profilanswer
 

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

n°820638
Taz
bisounours-codeur
Posté le 11-08-2004 à 18:55:27  profilanswer
 

oui

n°821103
jesus_chri​st
votre nouveau dieu
Posté le 12-08-2004 à 09:42:54  profilanswer
 

... 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
n°821116
Taz
bisounours-codeur
Posté le 12-08-2004 à 09:55:02  profilanswer
 

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

n°821245
jesus_chri​st
votre nouveau dieu
Posté le 12-08-2004 à 11:31:25  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] problème membre statique

 

Sujets relatifs
[mysql] piti probleme mysqlprobleme awk
problème de portabilité versions excelproblème formulaire avec envoi de pièce jointe
Problème pour récuperer des variables POST - Débutant -Probleme avec un formulaire et easyphp
Probleme awk & split[C++] Compilation et link de librairie statique avec une DLL (VC++)?
[debutant] Probleme d'allocation memoire pour de grands tableauxdébutant en PHP a besoin d'aide !!Problème avec un formulaire ! ! ! !
Plus de sujets relatifs à : [C++] problème membre statique


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR