Redefinition de namespace - C++ - Programmation
Marsh Posté le 05-10-2007 à 17:43:08
salut,
il faudrait ajouter:
Code :
|
je crois que la différence de comportement vient du fait que poids est alloué en mémoire, alors qu'avant, ce n'était que des définitions.
EDIT: trop vite sans faire attention, je le corrige quand meme.
Marsh Posté le 05-10-2007 à 17:49:26
La commande est :
Code :
|
et non :
Code :
|
J'ai déja indiqué ces lignes sans que cela change quelquechose. Je ne les avais pas précisées pour alléger ma question.
Le problème n'est pas résolu avec cette modification.
Est-ce que vous connaitriez une solution ?
Cordialement,
Marsh Posté le 06-10-2007 à 01:40:08
ce que tu peux faire, c'est déclarer les eventuelles fonctions/classes dans le .h, et les variables, dans le .cc (c'est du c++ )
Code :
|
Code :
|
Code :
|
mais par contre, je suis pas sur que ca soit indispensable de déclarer une variable global de cette facon!
Marsh Posté le 08-10-2007 à 09:40:11
Merci de ces réponses.
J'aimerais comprendre plus précisément quel était mon erreur.
Est-ce qu'il y avait une double déclaration de la variable poids du namespace et que cela posait problème ?
Pourtant, quand je déclare la variable prix de la classe Article, elle apparait deux fois à la compilation (dans Article.o et main.o), sans que cela pose problème à l'édition de liens.
Pourquoi ce comportement différent ?
Marsh Posté le 08-10-2007 à 12:01:00
la variable prix n'est pas allouée, alors que poids si.
aucune instance de Article n'est déclaré dans le article.h.
Marsh Posté le 08-10-2007 à 13:22:33
Pour mieux comprendre, ce que tu dis, l'écriture
Code :
|
ne correspondrait pas à une allocation de poids
alors que :
Code :
|
correspondrait à allouer la variable poids ?
Est-ce bien cela que tu indiques ?
Pourquoi cette différence de comportement ?
Marsh Posté le 08-10-2007 à 13:36:05
Je suis pas expert, mais je sais que:
Code :
|
provoque une erreur car il n'y a aucune instance de A, ce n'est que la définition de la classe.
alors que
Code :
|
fonctionne car x est alloué en mémoire, le namespace ne fait que définir un espace pour les déclarations.
Marsh Posté le 08-10-2007 à 14:32:57
Bonjour,
Merci de ces différentes précisions.
J'ai essayé le code donné plus haut avec les trois fichiers mais cela ne semble pas accepter. D'une part, je ne parviens à définir le namespace en deux parties (d'une part dans Article.H, d'autre part dans Article.cpp. Ensuite, en déplaçant les lignes de code, je conserve un problème sur la non-déclaration ou des déclarations multiples de variables.
Marsh Posté le 08-10-2007 à 14:50:16
tuxce a écrit : Je suis pas expert, mais je sais que:
|
J'aimerais qu'on arrête de traiter le même problème dans 36 sujets. Déclaration != définition. Quelque soit votre membre statique, variable globale dans un namespace ou pas, il vous FAUT:
- .h qui contient la déclaration
- .cpp qui contient la définition et initialisation
Marsh Posté le 08-10-2007 à 15:13:24
Je veux bien essayer de revenir à ce sujet mais, dans ce cas, peut-tu donner un exemple simple d'utilisation d'une variable dans un namespace (et non pas d'une méthode). J'ai l'impression qu'il me faut passer par la redefinition d'une classe dans mon namespace pour cela.
Marsh Posté le 08-10-2007 à 15:25:18
redéfinition = illégal
a.h
namespace A { extern int x; }
a.cpp
namespace A { int x = 42; }
et voilà tu peux utiliser A::x partout.
Marsh Posté le 08-10-2007 à 15:43:09
sauf si a.h est inclus dans 2 .cpp différents.
nathan_g a écrit : J'ai essayé le code donné plus haut avec les trois fichiers mais cela ne semble pas accepter. D'une part, je ne parviens à définir le namespace en deux parties (d'une part dans Article.H, d'autre part dans Article.cpp. Ensuite, en déplaçant les lignes de code, je conserve un problème sur la non-déclaration ou des déclarations multiples de variables. |
tu peux poster la sortie?
chez moi, ca fonctionne (avec g++ -Wall: pas d'erreur)
Marsh Posté le 08-10-2007 à 15:52:50
Tuxce : merci de ce détail (sauf...) qui doit changer pas mal de chose.
En l'occurence, de manière simplifiée, mon code qui ne fonctionne pas est :
Fichier Article.H
Code :
|
Fichier Article.C:
Code :
|
Fichier main.C
Code :
|
La compilation ne fonctionne pas et me sort le message :
Code :
|
Comment donner à tout cela une écriture correcte ?
J'ai du rater quelque chose mais je ne vois pas comment donner une écriture correcte à ce code.
Marsh Posté le 08-10-2007 à 16:00:20
ca d'accord...
mais tu as essayé le code avec extern, je t'avais remis les 3 fichiers:
http://forum.hardware.fr/forum2.ph [...] 0#t1620020
Marsh Posté le 08-10-2007 à 16:43:06
Taz a écrit : putain je suis fatigué moi... désolé |
t'aurais pu rajouter à coté du "fatigué" comme quoi tu as édité le post d'avant en ajoutant le extern
en gros, ca revient à ce que j'ai posté avant!
Marsh Posté le 08-10-2007 à 16:49:41
Merci Tuxce de ton implication dans mon problème.
A moins que j'ai mal compris, j'ai modifié le précédent fichier main.C afin d'y inclure le " extern " ce qui donne le fichier main.C suivant , les deux autres n'étant pas modifiés :
Code :
|
Malheureusement, cela ne résouds en rien mon problème car le message d'erreur n'est pas modifié. Désolé !
Marsh Posté le 08-10-2007 à 17:20:14
il faut modifier les autres aussi:
article.h:
Code :
|
article.c:
Code :
|
Marsh Posté le 08-10-2007 à 17:33:59
Bon, sans doute que j'ai un peu de mal
Maintenant, le code est :
Article.H
Code :
|
Article.C :
Code :
|
et main.C :
Code :
|
Malheureusement, ca ne compiletoujours pas. Le message est maintenant :
Code :
|
Qu'est ce que j'ai raté ?
Ou est-le problème dans cette nouvelle écriture ?
Marsh Posté le 08-10-2007 à 18:33:10
faudra que tu m'expliques pourquoi tu n'as pas pris tel quel l'exemple que je t'ai donnée!!!
pour ton programme, il faut modifier:
Code :
|
par
Code :
|
Marsh Posté le 08-10-2007 à 18:37:14
Bonsoir,
Merci de cette nouvelle réponse, mais ce que tu proposes ne change absolument rien.
Le message d'erreur reste identique !
Peut-tu me confirmer que, de ton coté, la compilation de ces trois fichiers est acceptée et donne un executable fonctionnant normalement ?
Marsh Posté le 08-10-2007 à 18:46:08
Voir mon exemple corrigé
Code :
|
Marsh Posté le 08-10-2007 à 18:51:06
OK !!!!!!
Merci beaucoup Taz de cet exemple qui fonctionne parfaitement .
Il ne me reste plus qu'à analyser tout cela pour comprendre mes problèmes .
Merci également Tuxce du temps passé.
Je dormirais mieux ce soir.
Marsh Posté le 05-10-2007 à 16:56:38
Bonjour,
Je rencontre un comportement curieux à la compilation de plusieurs fichiers.
J'ai une fichier Article.H :
Un fichier Article.C :
et un fichier main.C :
Quand je compile séparément les deux fichiers Article.C et main.C puis que j'en réalise l'édition de liens, cela fonctionne parfaitement malgré l'apparition du code de Article.H à deux occasions dans l'executable final (Au début de Article.C et de main.C ).
Par contre, si je rajoute un namespace dans Article.H en l'écrivant ainsi :
Je trouve une erreur de compilation :
Pourtant si la première version de Article avec une redéfiniton des déclarations de Article.H est acceptée à la compilation, la seconde version devrait fonctionner, non ?
Quelqu'un pourrait-il m'indiquer ou est le problème et la raison pour laquelle la première version est compilable et pas la seconde ?
Quelle serait la solution à adopter ?
D'avance merci de votre aide,