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 :

Héritage et inclusion


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 8
    Par défaut Héritage et inclusion
    Bonjour à tous,

    c'est mon premier message sur ce forum

    Alors je travaille avec C++ builder 2006 (sous windows donc...) et j'ai quelques petits soucis.

    Le projet comporte environ 50 classes (ben oui c'est un gros truc) et j'ai plein de liens entre les classes, héritage, association, composition ... En bref, rien d'extraordinaire.

    Pour que les en-têtes de fichiers ne soient pas surchargée j'ai décidé de créer un .h qui effectue toutes les inclusions et jusque là ça marche
    Mais j'ai un soucis au niveau des héritage, j'ai une classe TSouris_seg qui hérite d'une classe TEvenement_seg mais le compilateur dit qu'il ne trouve pas le type, alors qu'il le trouve en tant qu'attribues d'une autre classe...

    Donc voici ma classe TSouris_seg:

    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
    21
    //---------------------------------------------------------------------------
     
    #ifndef TSourisH
    #define TSourisH
     
    #include "header.h"
    //---------------------------------------------------------------------------
     
    class TSouris_seg : public TEvenement_seg{
    	private:
    		...
    	protected:
    	public:
    		TSouris_seg();
    		~TSouris_seg();
    		void DeclancherEvenement();
     
    		/////////////// Tous les accesseurs pour toutes les variables //////////
    		...
    };
    #endif
    le cpp de cette classe :

    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
    //---------------------------------------------------------------------------
     
     
    #pragma hdrstop
    #include "TSouris.h"
    //--------------------------------------------------------------------------
     
    #pragma package(smart_init)
     
     
    TSouris_seg::TSouris_seg(){
    }
    TSouris_seg::~TSouris_seg(){
    }
     
    ...
    }

    la classe TEvenement_seg qui est abstraite:

    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
    //---------------------------------------------------------------------------
     
    #ifndef TEvenementH
    #define TEvenementH
    #include "header.h"
    //---------------------------------------------------------------------------
    class TEvenement_seg {
    	private:
    		TProjet_seg* projet;
    	protected:
    	public:
    		TProjet_seg* getProjet();
    		void setProjet(TProjet_seg* newProjet);
     
    };
    #endif
    Y a rien d'extraordinaire dans le CPP...

    Et maintenant le header.h qui doit faire toutes mes inclusions:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    //Ficher d'inclusion de toutes les bibliothèques
    /* Ceci est dûe au parcours des librairies dans le .H */
    #ifndef HEADER_H
    #define HEADER_H
     
    //Bibliothèques C++
    #include <fstream.h>
    #include <string.h>
     
     
    //Bibliothèque externe
    #include "atDiagram.hpp"
     
     
    ////////Liste de tous les types
    class TProjet_seg;
    class TEvenement_seg;
     
    ...
     
    class TSouris_seg;
     
    ..................
     
     
    //Bibliothèques du projet
     
    #include "TProjet.h"
     
    .........
     
    #include "TEvenement.h"
    #include "TSouris.h"
    #include "TClavier.h"
     
    .....
     
    #endif
    Et l'erreur du compilateur est:
    [C++ Erreur] TSouris.h(10): E2029 'TEvenement_seg' doit être une classe ou une structure précédemment définie


    Voila, j'espère que j'ai été claire sur mon problème, est-ce que quelqu'un peut m'aider?

    Je vous remercie d'avance prendre un peu de votre temps pour vous penchez sur mon problème

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    Citation Envoyé par Louzof Voir le message
    Pour que les en-têtes de fichiers ne soient pas surchargée j'ai décidé de créer un .h qui effectue toutes les inclusions et jusque là ça marche
    Si toutes les classes de ton projet incluent header.h, qui lui-même inclue toutes les classes, c'est à mon avis une très mauvaise idée, peut-être que ton problème vient de là. En plus ça doit pas compiler super vite

    Sinon tu t'es peut-être emmêlé avec tes directives pré-processeur #ifndef #define #pragma, ou autre (genre un copier-coller qui a mal tourné). Quelle est l'erreur exacte du compilateur, quelle est la ligne fautive?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 8
    Par défaut
    Citation Envoyé par Cheps Voir le message
    Si toutes les classes de ton projet incluent header.h, qui lui-même inclue toutes les classes, c'est à mon avis une très mauvaise idée, peut-être que ton problème vient de là. En plus ça doit pas compiler super vite
    En faite c'est pas vraiment un problème vue qu'il ne va effectuer qu'une seule compilation de chaque fichier quoi qu'il arrive

    Citation Envoyé par Cheps Voir le message
    Sinon tu t'es peut-être emmêlé avec tes directives pré-processeur #ifndef #define #pragma, ou autre (genre un copier-coller qui a mal tourné). Quelle est l'erreur exacte du compilateur, quelle est la ligne fautive?
    Je pense pas que je me suis embrouillé avec les inclusions ni les pragma, les inclusions il n'y en a que quelques unes et les pragma c'est ceux de C++ builder j'en est pas rajouté.

    Sinon la ligne qui pose problème c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class TSouris_seg : public TEvenement_seg{
    (dans TSouris.h)

    et l'erreur c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [C++ Erreur] TSouris.h(10): E2029 'TEvenement_seg' doit être une classe ou une structure précédemment définie

    Il est important de savoir que si j'enlève l'héritage ça marche mais par contre ça plante sur un autre héritage d'une autre classe. Donc je pense qu'il y a un souci dans mon header qui pose problème avec les héritage...

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    Citation Envoyé par Louzof Voir le message
    En faite c'est pas vraiment un problème vue qu'il ne va effectuer qu'une seule compilation de chaque fichier quoi qu'il arrive
    Oui mais si tu modifies un petit truc dans un fichier, il doit te recompiler tout le projet.

    Bon j'ai créé un nouveau projet avec Visual Studio et j'y ai mis les fichiers tels qu'ils sont là, ça compile sans problème (j'ai juste viré le #pragma package(smart_init) qui n'est pas reconnu par VS). Je vois pas d'erreur dans ce que tu as posté. Mais à mon avis ton principe du fichier unique d'inclusion est à revoir.


    P.S. : tu devrais utiliser <fstream> et <cstring> qui sont les bibliothèques C++ standard, plutôt que <ifstream.h> et <string.h> qui sont là essentiellement pour la compatibilité avec C.

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Je n'ai pas de réponse directe, mais je vois un truc qui pourrait être une partie du problème: il est inutile (et peut-être dangereux) de pré-déclarer une classe (class TSouris_seg; ) et d'include l'en-tête où cette classe est définie. Il faut faire l'un ou l'autre, suivant le besoin, mais pas les deux.

    Hope it helps.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 8
    Par défaut
    Donc en faite le problème viendrais de mon fichier unique d'inclusion. Il est vrai que ça marchais avant de mettre ce fichier d'inclusion mais je voulais enlever ces en-têtes de 15 lignes pour mon projet.
    Par contre dans mon projet j'ai des classes qui s'appelle mutuellement les unes les autres d'autre avec des héritage... et je voudrais vraiment éviter de mettre des pleins d'include dans chaque fichier...

    Est-ce qu'il y aurais un autre moyen pour faire ça? faire une .h avec des trucs spécifiques dedans... ou autres?


    PS: <fstream> et <cstring> ne sont pas reconnu.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    Citation Envoyé par Louzof Voir le message
    Est-ce qu'il y aurais un autre moyen pour faire ça? faire une .h avec des trucs spécifiques dedans... ou autres?


    PS: <fstream> et <cstring> ne sont pas reconnu.
    Je vois pas où est le problème d'avoir 15 include dans chaque fichier d'en-tête, c'est même mieux de savoir de quels autres fichiers il dépend.

    Si fstream et cstring ne sont pas reconnus, alors ce n'est pas un compilateur C++ standard (ou il est mal installé).

  8. #8
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par buggen25 Voir le message
    Salut
    dans le fichier header.h ta fait un cmpilation conditionnelle du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #ifndef HEADER_H
    #define HEADER_H
    et pour TSouris.h ta mis TSourisH, pourquoi pas TSOURIS_H pour etre coherent.mais je pense pas que sa a une incidence sur le code
    Cordialement
    Effectivement ce n'est pas beau mais ça n'a aucune incidence sur le code.

    Citation Envoyé par Louzof Voir le message
    Donc en faite le problème viendrais de mon fichier unique d'inclusion. Il est vrai que ça marchais avant de mettre ce fichier d'inclusion mais je voulais enlever ces en-têtes de 15 lignes pour mon projet.
    Par contre dans mon projet j'ai des classes qui s'appelle mutuellement les unes les autres d'autre avec des héritage... et je voudrais vraiment éviter de mettre des pleins d'include dans chaque fichier...
    Essaie de supprimer les pré-déclarations de tes classes dans ce fichier d'inclusion.

    Citation Envoyé par Louzof Voir le message
    Est-ce qu'il y aurais un autre moyen pour faire ça? faire une .h avec des trucs spécifiques dedans... ou autres?
    Ben, pas que je sache. D'ailleurs, ce que tu essaie de faire est une bonne chose, et c'est une méthode beaucoup utilisée.

    Mais bien souvent (attention, je dis "souvent", ce n'est pas obligatoirement ton cas), ce genre de problème d'inclusions proviennent d'une mauvaise conception. Il faut, par exemple, éviter (tant que faire se peut, et ce n'est pas toujours possible et/ni la meilleure solution) les références croisées et essayer d'avoir un graphe de référence qui ressemble le plus possible à un arbre.

  9. #9
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    Salut
    dans le fichier header.h ta fait un cmpilation conditionnelle du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #ifndef HEADER_H
    #define HEADER_H
    et pour TSouris.h ta mis TSourisH, pourquoi pas TSOURIS_H pour etre coherent.mais je pense pas que sa a une incidence sur le code
    Cordialement

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 8
    Par défaut
    Citation Envoyé par buggen25 Voir le message
    Salut
    dans le fichier header.h ta fait un cmpilation conditionnelle du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #ifndef HEADER_H
    #define HEADER_H
    et pour TSouris.h ta mis TSourisH, pourquoi pas TSOURIS_H pour etre coherent.mais je pense pas que sa a une incidence sur le code
    Cordialement
    En effet, c'est simplement parce que TSouris a été mis automatiquement par delphi alors que j'ai écris le header moi même mais t'a raison je vais le changer c'est pas beau ^^

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

Discussions similaires

  1. JSF - inclusion et héritage
    Par gondek dans le forum JSF
    Réponses: 1
    Dernier message: 06/08/2008, 11h18
  2. [Débutant] Inclusion et héritage.
    Par Noxhag dans le forum C++
    Réponses: 0
    Dernier message: 04/11/2007, 19h23
  3. conflit d'inclusions et Héritage de classe
    Par gedeon555 dans le forum C++
    Réponses: 7
    Dernier message: 01/10/2006, 19h48
  4. Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/08/2002, 16h30
  5. Inclusion de fichiers en IDL
    Par babou dans le forum CORBA
    Réponses: 10
    Dernier message: 30/07/2002, 16h47

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