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 :

#include toto.h groupé puis-je le faire?


Sujet :

C++

  1. #1
    Membre éprouvé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 951
    Par défaut #include toto.h groupé puis-je le faire?
    bonjours,

    afin d'eviter d'avoir une dependance croisée a gerer, j'ai essayé de grouper deux fichiers d'en tete en un seul (que nous nommeront toto.h et foo.h)

    j'ai donc tout regroupé dans toto.h

    mon toto.cpp fonctionne comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include toto.h
    #include foo.cpp
    et mon foo.cpp reprend donc une des deux classes declarees dans toto.h

    cependant, ca ne marche pas, le compilateur considerant que rien n'a ete definit pour foo.cpp
    donne
    'foo' has not been declared
    j'ai donc essayé de re-inclurer le fichier d'en tete dans foo.cpp, mais ca ne marche pas non plus :
    multiple definition of `foo::foo()'
    en esperant avoir ete suffisamment clair...

  2. #2
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    je ne suis pas sur de tout comprendre, mais habituellement dans ce genre de situation on utilise un mécanisme de protection contre la mutiple inclusion.
    Exemple:
    toto.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef __TOTO_H__
    #define __TOTO_H__
    /* to code (decalration de stucture, de classe,...) */
    #endif
    pour foo.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifndef __FOO_H__
    #define __FOO_H__
    #include toto.h
    /* to code (decalration de stucture, de classe,...) */
    #endif
    et dans foo.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include toto.h
    #include foo.h
    de cetyte façon quand tu vas passer une deuxième fois dans toto.h il ne se passera rien. Et tu aura pas de definition multiple.

  3. #3
    Membre éprouvé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 951
    Par défaut
    oui, mais en fait, dans ma classe foo, j'utilise des elements de toto, et dans ma classe toto, j'utilise des elements de foo.

    en d'autres termes, j'ai une reference croisée...

    alors certes, je pourrait faire :
    foo.h
    toto.hmais en fait, dans ma classe toto, j'accede a un element pointé dans foo...

    c'est a dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class foo {
    public :
    int *bar;
    }
    et dans toto.cpp :(c'est du metha code, c'est pasces types la que j'utilise, mais le principe est le meme)

    et donc, bien... j'arrivait pas a faire tout marcher nickel, donc je me suis dit que tout declarer dans un meme fichier d'en tete pourrait resoudre mon pb...
    mais j'ai les erreures du premier post qui me bloquent...

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    La déclaration anticipée est pourtant la seule bonne solution

    http://c.developpez.com/faq/cpp/?pag...erence_croisee

  5. #5
    Membre éprouvé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 951
    Par défaut
    et tu est sur que ca ne pose aucun pb?

    parceque je ne peut pas me contenter de faire un
    je suis obligé de faire (au moins) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class vncPeuThreadeFrm : public wxFrame
    {
     	  public :
    	  wxTextCtrl *memoLog;
    };
    et ca ne me gene pas du tout, mais comme vous l'aurez compris en voaynt ce code, j'utilise wxwidgets...
    et des que j'ai un dependance croisée, j'ai un pb avec mon gestionnaire d'evenement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BEGIN_EVENT_TABLE(vncPeuThreadeFrm,wxFrame)
    	////Manual Code Start
    	EVT_SOCKET(SERVER_IMG_ID,  vncPeuThreadeFrm::OnServerEventImg)
    ...
    END_EVENT_TABLE()
    me donne :
    ISO C++ does not permit `wxFrame::sm_eventTable' to be defined as `vncPeuThreadeFrm::sm_eventTable'
    alors que je n'ai pas cette erreure si je n'ai pas de reference croisée!

    et j'arrive pas a la resoudre!
    a chaque fois, je pourrit tellement mon code qu'au finla, je suis obligé de tout recommecner (j'en suis a ma 10eme version ^^ (sisi!))

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Un dépendance croisée résulte généralement d'un mauvais design. Peux-tu détailler tes relations ?

  7. #7
    Membre éprouvé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 951
    Par défaut
    alors, (je l'ai jamais fait, en fait, je sait pas ce que je doit te repondre, donc je me lance au hasard)

    j'ai ma classe wxframe
    =>l'equivalent du main avec wxwidgets

    lors de la création du GUI, je crée en meme temps 2 sockets.

    ensuite, a l'aide d'une gestion evenementielle (click sur un bouton...) je "specialise ces sockets" (en client ou en serveur) et, a partir de la, je veut lancer deux thread distinct, gerant ces sockets.

    donc, pour lancer les threads, je doit les instancier dans cette classe
    => connaitre leur type. (reference 1)

    hors, avec wxwidgets, il faut faire un heritage de la classe "wxThread", et y redefinir ses methodes metiers, afin d'obtenir un thread servant a quelque chose...
    pour le moment, je veut pouvoir acceder a la fenetre principale (la premiere classe dont j'ai parlé) afin de pouvoir logger facilement mes actions (peut important, je l'accorde), a l'aide d'une liste deroulante (reference 2)

    mais, dans tous les cas, j'aurais besoin, pour l'un des threads, d'acceder a une bitmap stockée en memoire... et accessible depuis ma classe principale, en effet, elle (ou une autre) devra l'afficher...



    bon, merci, grace a toi, j'ai vu que mon pb etait assez pueril, pour le moment, je me repencherait dessus quand j'en serait a ma bitmap a afficher...
    ps : si je declare ma strucuture "bitmap" en double, et que du coté du "main" je la met en globale, ca devrait passe non? (cad : par de reference croisée?)

  8. #8
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Dans la plupart des tollkit C++, l'équivalent de main() c'est un objet application singleton. Avec wxWidgets, il s'agit de wxApp. La fonction main() est remplacée par wxApp::OnInit(). Tu accès à ton objet application wxGetApp.
    wxFrame c'est juste une fenêtre principale.

  9. #9
    Membre éprouvé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 951
    Par défaut
    bon, bein Ctrl+R de ce que t'a dit

    (on remplace, mias ca change pas grand chose, ca montre juste mon incompetence, mais la logique soutenante est la meme => mon pb est le meme, je veut dire)

    merci de cette precision quand meme

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    Une petite précision sur les références croisées (qu'il faudrait peut-être ajouter à la FAQ).
    La déclaration anticipée permet de déclarer des pointeurs de ce type mais pas d'appeler ses méthode.

    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
    19
    20
     
    //déclaration préalable de B
    class B;
    //déclaration de A
    class A {
    private:
    	B* _b;
    public:
    	//void DoA(void) {_b->DoB();}; //erreur : undefined type B
    	void DoA(void);	//ok : pas de référence à une méthode de B
    	};
    //déclaration de B
    class B {
    private:
    	A* _a;
    public:
    	void DoB(void) {_a->DoA();};
    	};
    //définition une fois que B est définie
    void A::DoA(void) {_b->DoB();}; //ok : B est défini

  11. #11
    Membre éprouvé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 951
    Par défaut
    merci de cet eclaircissement, c'est bien ce que j'essayait de faire: )

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    C'est pourtant suffisamment explicite dans la FAQ je trouve...

    Citation Envoyé par La FAQ C++
    Cela marche car tant qu'on n'utilise qu'un pointeur ou une référence, le compilateur n'a pas besoin de connaître en détail le contenu de la classe. Il a juste besoin de savoir qu'elle existe. Par contre au moment d'utiliser celle-ci (appel d'une fonction membre par exemple) il faudra bien avoir inclus son en-tête, mais ce sera fait dans le .cpp et non plus dans le .h, ce qui élimine le problème d'inclusions cyclique.

  13. #13
    Membre éprouvé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 951
    Par défaut
    ok, encore une fois, c'est ce que je faisait lol, j'apelleit le .cpp, pas le .h ^^

    bon, ca va peut etre marcher... MERCI

  14. #14
    Membre éprouvé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 951
    Par défaut
    rah! mes erreures venaient apparement du fait que je faisait des include sur les fichiers .cpp..

    il ne faut pas les inclure, c'est bien ca?

    bon, je met resolu, car ca m'a l'air de fonctionner...

    merci encore

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    rah! mes erreures venaient apparement du fait que je faisait des include sur les fichiers .cpp..

    il ne faut pas les inclure, c'est bien ca?
    Tout à fait. Un .cpp est fait pour être compilé, ce sont les en-têtes (.h) qui sont prévus pour être inclus.

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    Citation Envoyé par Loulou24
    C'est pourtant suffisamment explicite dans la FAQ je trouve...

    Citation Envoyé par La FAQ C++
    Cela marche car tant qu'on n'utilise qu'un pointeur ou une référence, le compilateur n'a pas besoin de connaître en détail le contenu de la classe. Il a juste besoin de savoir qu'elle existe. Par contre au moment d'utiliser celle-ci (appel d'une fonction membre par exemple) il faudra bien avoir inclus son en-tête, mais ce sera fait dans le .cpp et non plus dans le .h, ce qui élimine le problème d'inclusions cyclique.
    Exact, je n'avais pas lu en détail

  17. #17
    Membre éprouvé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 951
    Par défaut
    en effet :
    On ne peut pas faire boire un âne qui n'a pas soif.
    mais tu n'est pas le seul
    (2d degré) ^^

  18. #18
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Par défaut
    Content que ma devise te plaise, j'en rougit des oreilles aux sabots.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2000] utilisation d'un groupe d'option pour faire des statistiques
    Par guaguanco dans le forum IHM
    Réponses: 1
    Dernier message: 23/06/2010, 18h55
  2. Installer Vista puis XP ou faire l'inverse
    Par Jeffik dans le forum Installation
    Réponses: 7
    Dernier message: 23/02/2009, 22h13
  3. [C#/Binding] Comment puis-je mieux faire ?
    Par boujouman dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 25/09/2008, 17h30
  4. Réponses: 6
    Dernier message: 14/06/2008, 17h46
  5. [VB.NET] accès direct puis séquentiel, comment faire
    Par lacsap49 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 01/06/2006, 13h09

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