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

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

Marsh Posté le 02-01-2004 à 00:42:55    

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
Reply

Marsh Posté le 02-01-2004 à 00:42:55   

Reply

Marsh Posté le 02-01-2004 à 00:47:16    

initialise ta variable:

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

Reply

Marsh Posté le 02-01-2004 à 00:49:37    

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
Reply

Marsh Posté le 02-01-2004 à 00:51:19    

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
Reply

Marsh Posté le 02-01-2004 à 00:52:03    

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

Reply

Marsh Posté le 02-01-2004 à 00:52:54    

*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

Reply

Marsh Posté le 02-01-2004 à 00:55:45    

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

Reply

Marsh Posté le 02-01-2004 à 00:55:56    

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

Reply

Marsh Posté le 02-01-2004 à 00:57:48    

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
 

Reply

Marsh Posté le 02-01-2004 à 00:57:59    

*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

Reply

Marsh Posté le 02-01-2004 à 00:57:59   

Reply

Marsh Posté le 02-01-2004 à 01:00:54    

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

Reply

Marsh Posté le 02-01-2004 à 01:01:54    

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.

Reply

Marsh Posté le 02-01-2004 à 01:03:38    

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
Reply

Marsh Posté le 02-01-2004 à 01:05:10    

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]

Reply

Marsh Posté le 02-01-2004 à 01:08:17    

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


 

Reply

Marsh Posté le 02-01-2004 à 01:10:00    

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

Reply

Marsh Posté le 02-01-2004 à 01:14:11    

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

Reply

Marsh Posté le 02-01-2004 à 09:37:29    

*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 )-
Reply

Marsh Posté le 02-01-2004 à 09:58:42    

Tata Testbidon1 = new Tata();
 
 
?

Reply

Marsh Posté le 02-01-2004 à 11:04:35    

java ou c# inside ? :p


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

Sujets relatifs:

Leave a Replay

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