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

  FORUM HardWare.fr
  Programmation
  C++

  Probleme d'exportation de constante membre

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme d'exportation de constante membre

n°441598
Ace17
Posté le 27-06-2003 à 12:00:08  profilanswer
 

Voici mes fichiers :
 
 

Code :
  1. // MyLib.h  
  2. class MyClass
  3. {
  4. public:
  5.     static const unsigned char MyConst;
  6. };

 
 

Code :
  1. // MyLib.cpp  
  2. #include "MyLib.h"
  3. const unsigned char MyClass::MyConst = 0;

 
 
Ces deux fichiers me génerent un .lib ( libraire statique ) que j'utilise dans un projet. J'ai un probleme dans ce fichier :
 

Code :
  1. // Projet.cpp
  2. #include <MyLib.h>
  3. unsigned char MyChar = MyClass::MyConst;


 
Et la, au linkage, il me sort :
 
error LNK2001: unresolved external symbol "public: static unsigned char const  MyClass::MyConst" (?MyConst@MyClass@@2EB)
 
J'ai été voir dans le fichier .lib, MyConst apparait, mais différement, en effet la décoration n'est pas la meme :
 
error LNK2001: unresolved external symbol "public: static unsigned char const  MyClass::MyConst" (?MyConst@MyClass@@0EB)
 
D'ou vient cette différence?


Message édité par Ace17 le 27-06-2003 à 12:00:43
mood
Publicité
Posté le 27-06-2003 à 12:00:08  profilanswer
 

n°441608
Taz
bisounours-codeur
Posté le 27-06-2003 à 12:12:48  profilanswer
 

essayes en initialisant au meme endroit que la déclaration

n°441613
Ace17
Posté le 27-06-2003 à 12:20:57  profilanswer
 

J'ai déja essayé ... il accepte pas; Il me sort :
 
illegal pure syntax, must be '= 0'
 
Entre nous je trouve ce message d'erreur assez bizarre...

n°441616
chrisbk
-
Posté le 27-06-2003 à 12:23:37  profilanswer
 

il est joli effectivement [:fifiz] (s'emmele avec les fonctions virtuelles pures)

n°441621
Taz
bisounours-codeur
Posté le 27-06-2003 à 12:25:51  profilanswer
 

:pfff:

n°441622
Ace17
Posté le 27-06-2003 à 12:26:05  profilanswer
 

Non, sérieux, c'est normal ce message d'erreur?  
On a bien le droit de déclarer des constantes dans une classe, non?

n°441628
Taz
bisounours-codeur
Posté le 27-06-2003 à 12:31:14  profilanswer
 

entières oui

n°441632
chrisbk
-
Posté le 27-06-2003 à 12:32:03  profilanswer
 

fais un enum plutot [:joce]

n°441634
Taz
bisounours-codeur
Posté le 27-06-2003 à 12:33:14  profilanswer
 

ben du à certains compilo, c'est effectivement une technqiue tout à fait correcte

n°441698
R3g
fonctionnaire certifié ITIL
Posté le 27-06-2003 à 13:11:17  profilanswer
 

Ace17 a écrit :

J'ai déja essayé ... il accepte pas; Il me sort :
 
illegal pure syntax, must be '= 0'
 
Entre nous je trouve ce message d'erreur assez bizarre...


VC++ roulaize...  
 
EDIT : j'avais dis une connerie. Une grosse.


Message édité par R3g le 27-06-2003 à 13:11:58
mood
Publicité
Posté le 27-06-2003 à 13:11:17  profilanswer
 

n°441718
HelloWorld
Salut tout le monde!
Posté le 27-06-2003 à 13:34:46  profilanswer
 

C'est un bug du compilo. Y'a plusieurs alternatives :

Code :
  1. class MyClass
  2.   {
  3.     public:
  4.         static unsigned char GetMyConst() { return MyClass::MyConst; }
  5.     private:
  6.         static const unsigned char MyConst;
  7.   };


 
ou d'autres :
http://www.boost.org/more/int_const_guidelines.htm


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°441786
Taz
bisounours-codeur
Posté le 27-06-2003 à 14:10:18  profilanswer
 

:non: la vraie solution à ce genre de problème, pour des objets plus conséquents, c'est une foncction membre statique qui renvoie une référence et qui a une variable statique. ça donne lsassurance que l'objet est bien construit au moment de l'appel. ta technique ne resout rien et renvoyer une copie c'est maladroit

n°441796
LetoII
Le dormeur doit se réveiller
Posté le 27-06-2003 à 14:14:51  profilanswer
 

++Taz a écrit :

:non: la vraie solution à ce genre de problème, pour des objets plus conséquents, c'est une foncction membre statique qui renvoie une référence et qui a une variable statique. ça donne lsassurance que l'objet est bien construit au moment de l'appel. ta technique ne resout rien et renvoyer une copie c'est maladroit


 
En même temps pour un unsigned car ça prend moin de place sur la pile  [:spamafote]  
 
Par contre la variable static c pas con.


---------------
Le Tyran
n°441803
Taz
bisounours-codeur
Posté le 27-06-2003 à 14:18:17  profilanswer
 

ben on parle génériquement là... c'est sur que la ref pour un entier, mais bon, le cas const est un sous cas

n°441806
LetoII
Le dormeur doit se réveiller
Posté le 27-06-2003 à 14:19:46  profilanswer
 

++Taz a écrit :

ben on parle génériquement là... c'est sur que la ref pour un entier, mais bon, le cas const est un sous cas


 
C sur que dans le cas générique on s'orienteras plus vers une référence.


---------------
Le Tyran
n°441899
HelloWorld
Salut tout le monde!
Posté le 27-06-2003 à 15:32:04  profilanswer
 

Citation :

:non: la vraie solution à ce genre de problème, pour des objets plus conséquents, c'est une foncction membre statique qui renvoie une référence et qui a une variable statique. ça donne lsassurance que l'objet est bien construit au moment de l'appel. ta technique ne resout rien et renvoyer une copie c'est maladroit


 
J'avais d'abord pensé à écrire directement :

Code :
  1. class MyClass
  2. {
  3.    public:
  4.        static unsigned char GetMyConst() { return 0; }
  5. };

 
 
Mais je pensais que Ace17 voulais garder sa variable membre statique .
En revanche, j'ai du mal à te suivre en ce qui concerne la possibilité de renvoyer un objet non construit.
En quoi une variable statique déclarée à l'intérieur du corps d'une fonction est plus sûre (systématiquement construite avant l'appel) qu'une variable statique déclarée dans une classe ? (pas systématiquement construite ?) :??:
Je vois pas trop aussi pourquoi c'est maladroit de renvoyer une copie de char.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°441909
LetoII
Le dormeur doit se réveiller
Posté le 27-06-2003 à 15:37:05  profilanswer
 

Etant donné que tu va donné ça valeur initiale à ton champ statique dans un fichier CPP, tu n'est pas sur, si tu appelle ta méthode statique dans un autre module, que le membre sera bie ninitialisé avant l'appel.


---------------
Le Tyran
n°442114
Ace17
Posté le 27-06-2003 à 18:39:20  profilanswer
 

Bon, je crois que je vais opter pour le enum  :D

n°443138
HelloWorld
Salut tout le monde!
Posté le 29-06-2003 à 17:14:32  profilanswer
 

Citation :

Etant donné que tu va donné ça valeur initiale à ton champ statique dans un fichier CPP, tu n'est pas sur, si tu appelle ta méthode statique dans un autre module, que le membre sera bie ninitialisé avant l'appel.


 
Je comprend toujours pas ... je vais t'expliquer comment je pense que cela ça se passe, ccorrige moi :
une variable membre statique est considérée par le compilo de la même manière qu'une variable globale. Elle est placée sur le tas, et initialisée avant même l'appel à main. Dans le cas d'un type simple, sa valeur est directement placée dans l'exe, dans une section "variables initialisées" (.data). Pour les objets, le compilo se charge d'appeler leur constructeur, mais je ne sais pas trop quand. Peut être que c'est là que ça pose problème.
Mais je comprend pas pourquoi en étant une variable statique on est sûr que c'est bien construit, et en étant un attribut de classe statique on ne l'est pas. A moins que ce ne soit la référence qui joue, ce que j'aurais encore + de mal à comprendre.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°443679
LetoII
Le dormeur doit se réveiller
Posté le 30-06-2003 à 08:41:35  profilanswer
 

HelloWorld a écrit :

Citation :

Etant donné que tu va donné ça valeur initiale à ton champ statique dans un fichier CPP, tu n'est pas sur, si tu appelle ta méthode statique dans un autre module, que le membre sera bie ninitialisé avant l'appel.


 
Je comprend toujours pas ... je vais t'expliquer comment je pense que cela ça se passe, ccorrige moi :
une variable membre statique est considérée par le compilo de la même manière qu'une variable globale. Elle est placée sur le tas, et initialisée avant même l'appel à main. Dans le cas d'un type simple, sa valeur est directement placée dans l'exe, dans une section "variables initialisées" (.data). Pour les objets, le compilo se charge d'appeler leur constructeur, mais je ne sais pas trop quand. Peut être que c'est là que ça pose problème.
Mais je comprend pas pourquoi en étant une variable statique on est sûr que c'est bien construit, et en étant un attribut de classe statique on ne l'est pas. A moins que ce ne soit la référence qui joue, ce que j'aurais encore + de mal à comprendre.


 
T'as la réponse dans ton text: c initialisé avant le main, mais c pas la seule chose à dnas ce cas là, imagine un truc tout con:
 
A.h

Code :
  1. class A
  2. {
  3.    public:
  4.             const static int NumA;
  5. };


A.cpp

Code :
  1. const int A::NumA = 3;


B.h

Code :
  1. class B
  2. {
  3.    public:
  4.             const static int NumB;
  5. };


B.cpp

Code :
  1. #include "A.h"
  2. const int B::NumB = A::NumA;


C lequel qui est initialisé en premier? Ben on sait pas, d'où le PB.


---------------
Le Tyran
n°443728
HelloWorld
Salut tout le monde!
Posté le 30-06-2003 à 09:49:06  profilanswer
 

Ben j'aurais dis que le compilo s'y retrouve à l'édition des liens et initialise NumB avec NumA "en dur" dans l'exe.
Le mieux c'est que je vérifie cela avec un test.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°443735
LetoII
Le dormeur doit se réveiller
Posté le 30-06-2003 à 09:56:13  profilanswer
 

HelloWorld a écrit :

Ben j'aurais dis que le compilo s'y retrouve à l'édition des liens et initialise NumB avec NumA "en dur" dans l'exe.
Le mieux c'est que je vérifie cela avec un test.


 
Avec les types atomique c peut être pas très flagrant, mais ça pose des pb avec les objets, c certain.


---------------
Le Tyran
mood
Publicité
Posté le   profilanswer
 


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

  Probleme d'exportation de constante membre

 

Sujets relatifs
[Eclipse] Développement de fragments de plugin (problème)Problème avec une condition contenue dans une variable
Expression Reguliere ... Où est le problème ?Problème de pipe (grrrr)
probleme de mise en pageProbleme d utilisation d une DLL externe
[VC++] Problème étrange ![FLASH] J'ai un petit problème de séquence ?
[HTML/JS] Problème de RefreshProblème avec JCreator Pro
Plus de sujets relatifs à : Probleme d'exportation de constante membre


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