Probleme d'exportation de constante membre - C++ - Programmation
Marsh Posté le 27-06-2003 à 12:12:48
essayes en initialisant au meme endroit que la déclaration
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...
Marsh Posté le 27-06-2003 à 12:23:37
il est joli effectivement (s'emmele avec les fonctions virtuelles pures)
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?
Marsh Posté le 27-06-2003 à 12:33:14
ben du à certains compilo, c'est effectivement une technqiue tout à fait correcte
Marsh Posté le 27-06-2003 à 13:11:17
Ace17 a écrit : J'ai déja essayé ... il accepte pas; Il me sort : |
VC++ roulaize...
EDIT : j'avais dis une connerie. Une grosse.
Marsh Posté le 27-06-2003 à 13:34:46
C'est un bug du compilo. Y'a plusieurs alternatives :
Code :
|
ou d'autres :
http://www.boost.org/more/int_const_guidelines.htm
Marsh Posté le 27-06-2003 à 14:10:18
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
Marsh Posté le 27-06-2003 à 14:14:51
++Taz a écrit : 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
Par contre la variable static c pas con.
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
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.
Marsh Posté le 27-06-2003 à 15:32:04
Citation : 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 :
|
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.
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.
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.
Marsh Posté le 30-06-2003 à 08:41:35
HelloWorld a écrit :
|
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 :
|
A.cpp
Code :
|
B.h
Code :
|
B.cpp
Code :
|
C lequel qui est initialisé en premier? Ben on sait pas, d'où le PB.
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.
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. |
Avec les types atomique c peut être pas très flagrant, mais ça pose des pb avec les objets, c certain.
Marsh Posté le 27-06-2003 à 12:00:08
Voici mes fichiers :
Ces deux fichiers me génerent un .lib ( libraire statique ) que j'utilise dans un projet. J'ai un probleme dans ce fichier :
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