IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Plusieurs fichiers => Problème de Linkage


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par défaut Plusieurs fichiers => Problème de Linkage
    Bonjour,
    Je débute en C++ et j'ai de gros soucis.
    1) Mon projet commence à faire une dizaine de fichiers .cpp et une dizaine de .h
    Le problème c'est qu'il se lie entre eux (ex: La classe CMessage possède un objet de la classe CExpediteur qui possède un objet de la classe CAdresseEmail...). Bref j'ai plein de lien partout et j'arrive pas a la gérer. J'ai sans arret des erreurs et on me dit qu'il y a une redéfinition de la classe...

    J'arrive a résoudre le problème en faisant un shéma des classes et des liens entre elle...mais a chaque fois que j'en rajoute une, je dois recommencer...

    Il y aura pas un moyen plus simple de gérer ca?

    2)J'ai une fonction qui est utilisé dans plusieurs classes. J'aimerais la mettre dans un fichier a part et n'utiliser que celle la. Je la met dans un fichier FonctionsUtiles.cpp et je fais uniquement un include depuis une des classes. Je ne l'ai pas écrite à d'autre endroit. J'obtient ce message d'erreur que je ne comprend pas très bien ... Quand je demande l'aide de Visual, il me dit que je l'ai déjà définit a d'autre endroits :

    Error 3 error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl ExtraireMot(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (?ExtraireMot@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@H@Z) already defined in MailUserAgent.obj FonctionsUtiless.obj
    ps je suis sous Visual Studio 2005 / Windows Xp

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    1°) Si tes classes possèdent seulement des pointeurs/références vers d'autres, tu n'es pas obligé d'inclure les headers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    /////////
    // A.h
    /////////
     
    //gardes d'inclusion
    #ifndef A_H_INCLUS
    #define A_H_INCLUS
     
    //Au lieu de #include <b.h>
    //Car on a simplement une référence vers B
    class B;
     
    class A
    {
    	B & refB;
    };
     
    #endif// ! A_H_INCLUS
    2°) Montre-moi le .cpp et le .h qui déclarent et définissent ta fonction...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par défaut
    Non ce ne sont pas des pointeurs.

    En fait le problème est le suivant:

    ClasseA.h

    ClasseB.h

    ClasseC.h

    Utilieseont toutes les 3, les fonctions qui se trouvent dans le fichier FonctionsUtiles.cpp et qui sont définie dans FonctionsUtiles.h

    Or si je fais ca:

    ClasseA.h
    #include "FonctionsUtiles.h"
    ...

    ClasseB.h
    #include "FonctionsUtiles.h"
    ...

    ClasseC.h
    #include "FonctionsUtiles.h"
    ...

    Je porte atteinte a la règle du "One Definition rule" non? En tout cas le linker me vomi 3 messages d'erreur pour chaque classe en me disant que la fonction a déjà été déclarer.

    Comment faire alors? Si je ne la déclare que dans 1 classe, les autres ne vont pas comprendre la fonction...

  4. #4
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    tu ne peux pas faire l'include dans les cpp ?
    cela dit si A B et C ne se connaissent pas entre eux tes include devraient marcher. (ou alors quelque chose m'échappe)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par défaut
    Non l'include dans le cpp ne change rien...

    Si , il se connaisse et c'est justement ca mon gros problème. J'ai pleins de classe qui doivent s'include les une dans les autres avec des liens parfois assez complexe...et c'est justement ma première quesion...comment simplifier tous ca

  6. #6
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Je vais peut-être poser une question bête, mais as-tu inclus les gardes d'inclusion mentionnées dans le msg de Medinoc ?

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    1- Gardes anti réinclusion
    2- FAQ -> dépendances croisées
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. [MEX] Problème pour compiler plusieurs fichiers
    Par Leiloche dans le forum MATLAB
    Réponses: 3
    Dernier message: 28/10/2008, 13h57
  2. Réponses: 5
    Dernier message: 01/06/2007, 12h28
  3. Réponses: 5
    Dernier message: 03/04/2007, 16h11
  4. Réponses: 2
    Dernier message: 26/01/2007, 14h58
  5. Réponses: 10
    Dernier message: 12/06/2006, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo