Forum général.cherche-logiciel redefinition of ....

Posté par  .
Étiquettes : aucune
0
18
déc.
2005
J'ai un programme contenant différentes classes....qui s'appel l'une ds l'autres.....
et j'ai cette erreur qui revient tout le temps...: "redefintion of " et "previous defintion of"

Exemple:

Email.h:8: error: redefinition of ‘class Email’
Email.h:9: error: previous definition of ‘class Email’
pers.h:5: error: redefinition of ‘class personne’
pers.h:6: error: previous definition of ‘class personne’
Email.h:8: error: redefinition of ‘class Email’
Email.h:9: error: previous definition of ‘class Email’
pers.h:5: error: redefinition of ‘class personne’
pers.h:6: error: previous definition of ‘class personne’


merci d'avance..... :-)
  • # Hum

    Posté par  (site Web personnel) . Évalué à 2.

    Bon, je vais surement dire une connerie, mais je me lance :

    J'ai le vague souvenir de devoir entourer mes fichiers d'entete (.h) d'un bloc #ifdef - #endif

    Genre le fichier personne.h qui dira
    #if ndef PERSONNE_H

    #define PERSONNE_H 0

    //mon code ici

    #endif


    Comme ca si je fais un include de plusieurs de fichiers qui eux-même font un include de personne.h, alors ce fichier ne sera remonté qu'une fois, et donc pas de conflit. J'suis clair là ? J'espère ne pas dire une grosse connerie, j'pense pas inventer tout ce que je dis quand même :)
    • [^] # Re: Hum

      Posté par  . Évalué à 2.

      Sauf que je pense que ce sera pas suffisant. Je pense que rody a un fichier personne.h et un fichier Email.h Son fichier personne.h contient qqch comme
      class personne
      {
         ...
          Email *email;
         ...
      };
      
      et le fichier Email.h
      class Email
      {
         ...
         personne *_personne;
      };
      
      Pour résoudre ça il faut faire une "forward declaration", du genre
      class Email;
      
      au début de personne.h, en tout cas avant la déclaration de la classe personnel.
      • [^] # Re: Hum

        Posté par  . Évalué à 1.

        Ca fonctionnait ...puis vla maintentant que j'ai le meme problème avec mon "main".....

        Est ce que je dois mettre des directives de précompilation?????
        merci ps: erreur habituelle.....


        ->main.cpp:(.text+0x34): référence indéfinie vers « personne::personne(char*, char*, char*)»
        main.cpp:(.text+0x4f): référence indéfinie vers « personne::personne(char*, char*, char*)»
        main.cpp:(.text+0x66): référence indéfinie vers « CorrespondantEmail::CorrespondantEmail(char*)»
        main.cpp:(.text+0x7d): référence indéfinie vers « CorrespondantEmail::CorrespondantEmail(char*)»
        main.cpp:(.text+0x91): référence indéfinie vers « CorrespondantPostal::CorrespondantPostal(char*)»
        main.cpp:(.text+0xa5): référence indéfinie vers « CorrespondantPostal::CorrespondantPostal(char*)»
        main.cpp:(.text+0x114): référence indéfinie vers « message::message()»
        main.cpp:(.text+0x126): référence indéfinie vers « Email::Email()»
        main.cpp:(.text+0x296): référence indéfinie vers « message::check(char*)»
        main.cpp:(.text+0x2c7): référence indéfinie vers « message::check(char*)»
        main.cpp:(.text+0x31b): référence indéfinie vers « message::check(char*)»
        main.cpp:(.text+0x34c): référence indéfinie vers « message::check(char*)»
        main.cpp:(.text+0x40e): référence indéfinie vers « message::AffichMsg() »
        main.cpp:(.text+0x49b): référence indéfinie vers « Email::saisie(char*, char*)»
        main.cpp:(.text+0x4ad): référence indéfinie vers « Email::toString() »
        main.cpp:(.text+0x76f): référence indéfinie vers « Email::~Email()»
        main.cpp:(.text+0x78f): référence indéfinie vers « Email::~Email()»
        main.cpp:(.text+0x7a9): référence indéfinie vers « message::~message()»
        main.cpp:(.text+0x7c9): référence indéfinie vers « message::~message()»
        main.cpp:(.text+0x8bc): référence indéfinie vers « personne::~personne()»
        main.cpp:(.text+0x8d9): référence indéfinie vers « personne::~personne()»
        main.cpp:(.text+0x8f0): référence indéfinie vers « personne::~personne()»
        main.cpp:(.text+0x919): référence indéfinie vers « personne::~personne()»
        • [^] # Re: Hum

          Posté par  . Évalué à 1.

          Ah non !!! ce n'est pas le même problème. Tous à l'heure c'était un problème de compilation. Là c'est un problème de Link. Si ton fichier s'appelle main.cpp et qu'il a besoin de fonctions (ou de méthodes) définies dans Mail.cpp et pers.cpp, tu dois compiler en faisant :
          cc main.cpp Email.cpp pers.cpp -o ton_programme
          
          ou
          cc -c main.cpp 
          cc -c Email.cpp 
          cc -c pers.cpp 
          cc main.o Email.o pers.o -o ton_programme
          
          Si ton appli devient grosse, et longue à compiler, tu auras vite envie de faire un Makefile.
      • [^] # Re: Hum

        Posté par  . Évalué à 2.

        A noter que la forward declaration de la class Email dans personne.h ne resoudra pas le probleme a elle seule.

        Elle permet uniquement au compilateur de comprendre qu'une classe Email qui sera completement declarée ulterieurement est utilisée (indirectement, ici via des pointeurs) dans la declaration de la classe personne (personne.h).

        Pour que cela fonctionne il lui faudra egalement :

        1) ne PAS inclure la declaration complete de la classe Email (Email.h) dans/avant la declaration complete de la classe personne (personne.h).
        2) inclure la declaration complete de la classe Email (Email.h) _AVANT_ les definitions de la classe personne (classiquement: dans/au debut de personne.c).

        le 2 n'etant une obligation que si les definitions de la classe personne manipulent autre chose que des pointeurs sur la classe Email (accede a des membres quel qu'ils soient, en crée des instances, etc).

        bref il faut partir de l'aprioris que le compilateur est un idiot a qui il faut tout expliquer plus ou moins completement suivant le contexte :)
    • [^] # Re: Hum

      Posté par  . Évalué à -1.

      je vais essayer ca ...je te dit quoi !!! :-) merci

      ps: je pense que ça dois être ca oui....
    • [^] # Re: Hum

      Posté par  . Évalué à 1.

      Ca marche :-)

      merci

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.