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

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Accès propriété "static" d'une classe et linker error

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Accès propriété "static" d'une classe et linker error

n°600506
Profil sup​primé
Posté le 02-01-2004 à 00:42:55  answer
 

Alors voilà mon premier problème de l'année  :cry: :
 
J'ai une classe de "base" Toto et j'instancie plusieurs objets Tata qui sont dérivés de Toto.
Mais Toto contient une propriété membre compteur qui est static et donc partagée entre toute les instances...
 
Le problème c'est que mon compilo (j'utilise borland c++ builder 5) me sort un "Unresolved external Toto::coucou referenced from base.obj" dès que je tente d'accéder à "compteur" (Testbidon1->compteur=5;) et je comprends absolument pas pourquoi.
 
 

Code :
  1. class Toto
  2. {
  3. private:
  4. protected:
  5. static int compteur;
  6. public:
  7.         Toto();
  8.         virtual ~Toto();
  9. };
  10. class Tata : public Toto
  11. {
  12. private:
  13. //... ses trucs persos
  14. public:
  15.         //...idem méthodes persos
  16. };
  17. Tata Testbidon1 = new Tata();
  18. Tata Testbidon2 = new Tata();
  19. //assigne la valeur 5 au compteur
  20. //c'est ici que le compilo plante
  21. Testbidon1->compteur=5;
  22. //ca doit me sortir 5 puisque compteur est static
  23. Testbidon2->AfficheCompteur();
  24. delete Testbidon1;
  25. delete Testbidon2;


Message édité par Profil supprimé le 02-01-2004 à 00:43:24
mood
Publicité
Posté le 02-01-2004 à 00:42:55  profilanswer
 

n°600509
verdoux
And I'm still waiting
Posté le 02-01-2004 à 00:47:16  profilanswer
 

initialise ta variable:

Code :
  1. int Toto::compteur = 0;

n°600510
Profil sup​primé
Posté le 02-01-2004 à 00:49:37  answer
 

verdoux a écrit :

initialise ta variable:

Code :
  1. int Toto::compteur = 0;




 
A quel moment ? dans le constructeur de Toto ?


Message édité par Profil supprimé le 02-01-2004 à 00:49:57
n°600511
verdoux
And I'm still waiting
Posté le 02-01-2004 à 00:51:19  profilanswer
 

Au début du code par exemple, en dehors de corps de fonction.
 
Tu peux aussi le mettre dans la déclaration de classe:

Code :
  1. static int compteur = 0;


Message édité par verdoux le 02-01-2004 à 00:53:11
n°600512
*syl*
--> []
Posté le 02-01-2004 à 00:52:03  profilanswer
 

Et tes fonctions elles sont où ?? On comprends rien à ton code :o

n°600513
Profil sup​primé
Posté le 02-01-2004 à 00:52:54  answer
 

*syl* a écrit :

Et tes fonctions elles sont où ?? On comprends rien à ton code :o


 
On s'en fout, elles n'existent pas, c'etait juste pour l'exemple... ce n'est pas là que le problème se pose

n°600515
*syl*
--> []
Posté le 02-01-2004 à 00:55:45  profilanswer
 

J'te parlais de ton code Tata Testbi[...]delete Testbidon2;
 
Ton compteur est en protected donc si t'essaies d'y accéder en dehors d'une des 2 classes tu vas avoir du mal..

n°600516
Profil sup​primé
Posté le 02-01-2004 à 00:55:56  answer
 

verdoux a écrit :

Au début du code par exemple, en dehors de corps de fonction.
 
Tu peux aussi le mettre dans la déclaration de classe:

Code :
  1. static int compteur = 0;




 
Je veux bien mais ca ne change strictement rien, le compilo plante de la même façon

n°600517
verdoux
And I'm still waiting
Posté le 02-01-2004 à 00:57:48  profilanswer
 

billyboy78 a écrit :


 
Je veux bien mais ca ne change strictement rien, le compilo plante de la même façon


Euh oui, parce que c'est faux :D
 

n°600518
Profil sup​primé
Posté le 02-01-2004 à 00:57:59  answer
 

*syl* a écrit :

J'te parlais de ton code Tata Testbi[...]delete Testbidon2;
 
Ton compteur est en protected donc si t'essaies d'y accéder en dehors d'une des 2 classes tu vas avoir du mal..


 
Oui ok je sais mais c'est pas le but, il n'y a que les 2 objets Testbidon1 et Testbidon2 qui y accèdent, je n'y accède pas depuis autre part, et c'est justement ce qu'il me faut

mood
Publicité
Posté le 02-01-2004 à 00:57:59  profilanswer
 

n°600519
*syl*
--> []
Posté le 02-01-2004 à 01:00:54  profilanswer
 

billyboy78 a écrit :


 
Je veux bien mais ca ne change strictement rien, le compilo plante de la même façon

De toutes me semble bien que ça sert à rien : une variable statique est automatiquement définie à 0.
Confirmation needed mais j'crois pas me tromper :D

n°600520
*syl*
--> []
Posté le 02-01-2004 à 01:01:54  profilanswer
 

billyboy78 a écrit :


 
Oui ok je sais mais c'est pas le but, il n'y a que les 2 objets Testbidon1 et Testbidon2 qui y accèdent, je n'y accède pas depuis autre part, et c'est justement ce qu'il me faut

Bah déplace la déclaration dans public ou crée un accesseur.

n°600521
Profil sup​primé
Posté le 02-01-2004 à 01:03:38  answer
 

Bon c'est vrai que le code était pas très clair, voilà une version un peu plus clair pour savoir ou ca plante exactement...
 
C'est dans l'une des méthodes membres de Tata , donc elle peut accéder à compteur  :heink:  

Code :
  1. class Toto
  2. {
  3. private:
  4. protected:
  5. static int compteur;
  6. public:
  7.         Toto();
  8.         virtual ~Toto();
  9. };
  10. class Tata : public Toto
  11. {
  12. private:
  13. //... ses trucs persos
  14. public:
  15.       void SetCompteur(int Valeur);       
  16. };
  17. //méthode
  18. Tata::SetCompteur(int Valeur)
  19. {
  20. //le compilo plante la dessus
  21. compteur = Valeur;
  22. }
  23. Tata Testbidon1 = new Tata();
  24. Tata Testbidon2 = new Tata();
  25. //assigne la valeur 5 au compteur
  26. Testbidon1->SetCompteur(5);
  27. //ca doit me sortir 5 puisque compteur est static
  28. Testbidon2->AfficheCompteur();
  29. delete Testbidon1;
  30. delete Testbidon2;


Message édité par Profil supprimé le 02-01-2004 à 01:09:14
n°600523
*syl*
--> []
Posté le 02-01-2004 à 01:05:10  profilanswer
 

billyboy78 a écrit :

Bon c'est vrai que le code était pas très clair, voilà une version un peu plus clair pour savoir ou ca plante exactement...
 
C'est dans l'une des méthodes membres de Tata , donc elle peut accéder à compteur  :heink:  

Code :
  1. class Toto
  2. {
  3. private:
  4. protected:
  5. static int compteur;
  6. public:
  7.         Toto();
  8.         virtual ~Toto();
  9. };
  10. class Tata : public Toto
  11. {
  12. private:
  13. //... ses trucs persos
  14. public:
  15.       void SetCompteur(int Valeur);       
  16. };
  17. //méthode
  18. Tata::SetCompteur(int Valeur)
  19. {
  20. //le compilo plante la dessus
  21. coucou = Valeur;
  22. }
  23. Tata Testbidon1 = new Tata();
  24. Tata Testbidon2 = new Tata();
  25. //assigne la valeur 5 au compteur
  26. Testbidon1->SetCompteur(5);
  27. //ca doit me sortir 5 puisque compteur est static
  28. Testbidon2->AfficheCompteur();
  29. delete Testbidon1;
  30. delete Testbidon2;



[:quoted]
T'as plus qu'à te relire [:rofl2][:rofl2][:rofl2]

n°600526
verdoux
And I'm still waiting
Posté le 02-01-2004 à 01:08:17  profilanswer
 

Code :
  1. class Titi {
  2. static int n;
  3. };
  4. int Titi::n = 0;
  5. int main () {
  6. //bla ...


 

n°600528
Profil sup​primé
Posté le 02-01-2004 à 01:10:00  answer
 

*syl* a écrit :

[:quoted]
T'as plus qu'à te relire [:rofl2][:rofl2][:rofl2]


 
Arghh déguelasse, je viens de corriger, c'est le 1er janvier ca peut arriver  :ange:

n°600531
Profil sup​primé
Posté le 02-01-2004 à 01:14:11  answer
 

verdoux a écrit :

Code :
  1. class Titi {
  2. static int n;
  3. };
  4. int Titi::n = 0;
  5. int main () {
  6. //bla ...


 
 


 
Ok, comme ca, cela fonctionne merci, mais je suis obligé de faire ca pour chaque donnée membre qui est static alors ? c'est un peu chiant...

n°600562
blackgodde​ss
vive le troll !
Posté le 02-01-2004 à 09:37:29  profilanswer
 

*syl* a écrit :

De toutes me semble bien que ça sert à rien : une variable statique est automatiquement définie à 0.
Confirmation needed mais j'crois pas me tromper :D


 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. struct Test
  4. {
  5. static int i;
  6. };
  7. int Test::i;
  8. int main()
  9. {
  10. cout << Test::i;
  11. cin.ignore();
  12. }


 
==> 0


---------------
-( BlackGoddess )-
n°600568
Taz
bisounours-codeur
Posté le 02-01-2004 à 09:58:42  profilanswer
 

Tata Testbidon1 = new Tata();
 
 
?

n°600586
blackgodde​ss
vive le troll !
Posté le 02-01-2004 à 11:04:35  profilanswer
 

java ou c# inside ? :p


---------------
-( BlackGoddess )-

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

  [C++] Accès propriété "static" d'une classe et linker error

 

Sujets relatifs
Diff entre une définition dans la classe et dans le constructeur[java]Problème d'import de classe swing
[C++] implémentation d'une classe générique (liste chainée)Bloquer l'accés a un fichier PHP tout en utilisant webcron
bloquer acces page par mot de passe+empecher copier/printclasse graphics
classe template amieHéritage public, accès aux données privée de la mère
MySQL a répondu:You have an error in your SQL syntax near 'Serveur loc[TOMCAT] acces zone d'admin
Plus de sujets relatifs à : [C++] Accès propriété "static" d'une classe et linker error


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