Probleme d'exportation de constante membre

Probleme d'exportation de constante membre - C++ - Programmation

Marsh Posté le 27-06-2003 à 12:00:08    

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
Reply

Marsh Posté le 27-06-2003 à 12:00:08   

Reply

Marsh Posté le 27-06-2003 à 12:12:48    

essayes en initialisant au meme endroit que la déclaration

Reply

Marsh Posté le 27-06-2003 à 12:20:57    

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

Reply

Marsh Posté le 27-06-2003 à 12:23:37    

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

Reply

Marsh Posté le 27-06-2003 à 12:25:51    

:pfff:

Reply

Marsh Posté le 27-06-2003 à 12:26:05    

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

Reply

Marsh Posté le 27-06-2003 à 12:31:14    

entières oui

Reply

Marsh Posté le 27-06-2003 à 12:32:03    

fais un enum plutot [:joce]

Reply

Marsh Posté le 27-06-2003 à 12:33:14    

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

Reply

Marsh Posté le 27-06-2003 à 13:11:17    

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
Reply

Marsh Posté le 27-06-2003 à 13:11:17   

Reply

Marsh Posté le 27-06-2003 à 13:34:46    

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
Reply

Marsh Posté le 27-06-2003 à 14:10:18    

: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

Reply

Marsh Posté le 27-06-2003 à 14:14:51    

++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
Reply

Marsh Posté le 27-06-2003 à 14:18:17    

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

Reply

Marsh Posté le 27-06-2003 à 14:19:46    

++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
Reply

Marsh Posté le 27-06-2003 à 15:32:04    

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
Reply

Marsh Posté le 27-06-2003 à 15:37:05    

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
Reply

Marsh Posté le 27-06-2003 à 18:39:20    

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

Reply

Marsh Posté le 29-06-2003 à 17:14:32    

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
Reply

Marsh Posté le 30-06-2003 à 08:41:35    

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
Reply

Marsh Posté le 30-06-2003 à 09:49:06    

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
Reply

Marsh Posté le 30-06-2003 à 09:56:13    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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