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 :

Erreur avec une classe


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut Erreur avec une classe
    Salut à tous,

    Je suis étudiant en 1e année de DUT info et je dois réaliser un projet visant à reproduire une version simplifiée de Facebook en utilisant deux classes : une classe Personne et une classe Facebook. J'ai donc créé 4 fichiers : personne.h, personne.cpp, facebook.h et facebook.cpp. Un des attributs de ma classe Facebook est un tableau de Personnes contenant tous les inscrits. Afin de pouvoir travailler avec la classe Facebook dans la classe Personne, on me demande de faire une déclaration de la façon suivante dans mon fichier personne.h (chose que j'ai faite) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Facebook ;
    class Personne{} ;
    Si je n'inclus pas le fichier facebook.h dans mon fichier personne.h, le compilateur m'indique que les attributs de la classe Facebook que j'utilise dans les méthodes de Personne ne sont pas déclarés.
    Mais si je fais cette déclaration, j'obtiens l'erreur suivante dans mon fichier facebook.h (ligne 12) : "error: 'Personne' does not name a type"
    Et là je ne sais plus quoi faire

    Voici des extraits de mes deux headers :

    personne.h :

    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
    #ifndef PERSONNE_H_INCLUDED
    #define PERSONNE_H_INCLUDED
     
    #include <string>
    #include "facebook.h" // l'inclusion maudite qui fait foirer la compilation
     
    using namespace std;
     
    class Facebook;
     
    class Personne
    {
        private :
     
            string nom;
            string prenom;
     
        public :
     
            ...
    };
     
    #endif // PERSONNE_H_INCLUDED

    facebook.h :

    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
    #ifndef FACEBOOK_H_INCLUDED
    #define FACEBOOK_H_INCLUDED
     
    #include "personne.h"
     
    const int MAXPERSONNES=100;
     
    class Facebook
    {
        private :
     
            Personne fb[MAXPERSONNES]; // c'est ici que j'obtiens mon erreur
            int tabId[MAXPERSONNES];
            int nbPers;
            bool tabRelation[MAXPERSONNES][MAXPERSONNES];
     
        public :
     
            ...
    };
     
    #endif // FACEBOOK_H_INCLUDED

    J'espère donc que vous pourrez m'aider à résoudre ce problème

    Merci d'avance !

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    À mon avis, c'est parce que tu inclus Personne.h avant d'inclure Facebook.h quelque part dans ton main. Et sinon tu peux toujours faire exactement la même chose pour la classe Facebook (vis-à-vis de Personne) que ce que tu fais dans Personne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Personne;
     
    class Facebook
    {

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Salut Trademark,

    Merci mais malheureusement l'erreur persiste

  4. #4
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    La classe Facebook a besoin de la classe Personne car elle les repertorie, mais pourquoi Personne aurait besoin de Facebook?

    Cette dépendance circulaire ne me parait pas justifiée.

  5. #5
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Dans personne.h, tu n’as pas besoin d’inclure facebook.h.

    La « forward-declaration » (class Facebook; ) devrait suffire.

    En revanche, tu vas l’inclure dans le .cpp pour pouvoir utiliser les méthodes de ta classe Facebook

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Lorsque je met uniquement "class Facebook;" dans personne.h, le compilateur m'indique "error : 'attribut' was not declared in this scope" pour chaque attribut de Facebook que j'utilise dans les méthodes de Personne

  7. #7
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Il faut que tu écrives le corps de tes méthodes dans le .cpp, pas dans le .h, qui contient seulement les déclarations (= l’interface).

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Salut white_tentacle,

    Je procède toujours de cette manière

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    Peux tu poster les .h complets ?

    ça n'a pas de sens d'inclure à la fois facebook.h et de faire une forward déclaration de facebook.

  10. #10
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Il ne faut PAS inclure facebook.h dans personne.h, seulement faire une déclaration de la classe. C’est parce que tu as laissé cette inclusion que ça ne fonctionne pas.

    Je n’ai pas le temps de détailler plus, désolé, j’essaierai de le faire un peu plus tard.

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Ok white_tentacle je vais donc abandonner cette idée ^^.

    GeantVert13 voici mes headers complets :

    personne.h :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #ifndef PERSONNE_H_INCLUDED
    #define PERSONNE_H_INCLUDED
     
    #include <string>
     
    using namespace std;
     
    class Facebook;
     
    class Personne
    {
        private :
     
            string nom;
            string prenom;
     
        public :
     
            // constucteur vide initialisant nom et prénom avec une chaîne vide
            Personne();
     
            // constructeur à 2 paramètres permettant d'initialiser les attributs nom et prénom
            Personne(string,string);
     
            /* Mprocédure affiche()
            {affiche le nom et le prénom de la Personne cible}
            paramètre   (D) cible : Personne */
            void affiche() const;
     
            /* Mprocédure saisir()
            {saisit le nom et le prénom de la Personne cible}
            paramètre   (D) cible : Personne */
            void saisir();
     
            /* Mfonction getNom() retourne chaine
            {retourne le nom de la Personne cible}
            paramètre   (D) cible : Personne */
            string getNom() const;
     
            /* Mfonction getPrenom() retourne chaine
            {retourne le prenom de la Personne cible}
            paramètre   (D) cible : Personne */
            string getPrenom() const;
     
            // redéfinition de l'opérateur == pour comparer 2 Personnes selon l’ordre alphabétique de leurs noms et prénoms
            bool operator==(const Personne) const;
     
            // redéfinition de l'opérateur != pour comparer 2 Personnes selon l’ordre alphabétique de leurs noms et prénoms
            bool operator!=(const Personne) const;
     
            // redéfinition de l'opérateur < pour comparer 2 Personnes selon l’ordre alphabétique de leurs noms et prénoms
            bool operator<(const Personne) const;
     
            // redéfinition de l'opérateur > pour comparer 2 Personnes selon l’ordre alphabétique de leurs noms et prénoms
            bool operator>(const Personne) const;
     
            // redéfinition de l'opérateur <= pour comparer 2 Personnes selon l’ordre alphabétique de leurs noms et prénoms
            bool operator<=(const Personne) const;
     
            // redéfinition de l'opérateur >= pour comparer 2 Personnes selon l’ordre alphabétique de leurs noms et prénoms
            bool operator>=(const Personne) const;
     
            /* Mfonction inscription() retourne booléen
            {retourne faux si une personne de même nom et prénom est déjà inscrite dans le réseau ou s’il n’y a plus de place dans le réseau, vrai sinon}
            paramètre   (D) cible : Personne */
            bool inscription() const;
    };
     
    #endif // PERSONNE_H_INCLUDED
    facebook.h :

    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
    #ifndef FACEBOOK_H_INCLUDED
    #define FACEBOOK_H_INCLUDED
     
    #include "personne.h"
     
    const int MAXPERSONNES=100;
     
    class Facebook
    {
        private :
     
            Personne fb[MAXPERSONNES]; // tableau de Personnes contenant toutes les Personnes ayant un compte
            int tabId[MAXPERSONNES]; // tableau des identifiants des comptes Facebook
            int nbPers; // nombre de personnes ayant un compte dans le réseau Facebook
            bool tabRelation[MAXPERSONNES][MAXPERSONNES]; // tableau de booléens à 2 dimensions pour gérer les relations d’amitié dans le réseau Facebook
     
        public :
     
            // constructeur vide qui initialise tout simplement le nombre de Personnes à 0
            Facebook();
    };
     
    #endif // FACEBOOK_H_INCLUDED

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    dans ton personne.cpp as tu fais#include "facebook.h" ?

    EDIT: et, à moins que quelque chose m'échappe, tu n'as pas même pas besoin de la forward déclaration de facebook, puisqu'elle n'est jamais utilisée dans ton personne.h....

    EDIT2: juste par curiosité, pourquoi ne pas utiliser std::vector en lieu et place des tableaux ?

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    J'ai essayé mais cela ne change rien.

    J'ai fait une "forward déclaration" de Facebook car j'utilise des attributs de la classe Facebook dans les méthodes de Personne (et parce qu'on m'a demandé de le faire dans l'énoncé )

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    Tu peux poster le détail de l'erreur ? et éventuellement tes cpp ?

  15. #15
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Voilà les erreurs que j'obtiens (sans inclure facebook.h dans personne.h) :

    In member function 'bool Personne::inscription() const':
    97|error: 'nbPers' was not declared in this scope
    97|error: 'MAX' was not declared in this scope
    103|error: 'fb' was not declared in this scope

    et la méthode de laquelle viennent ces erreurs :

    personne.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    bool Personne::inscription() const
    {
        bool ok=(nbPers!=MAX);
        int i=0;
        // boucle qui parcourt le tableau fb
        while (ok && i<nbPers)
        {
            // compare la Personne cible avec celles du tableau fb
            ok=(*this!=fb[i]);
            i++;
        }
        return ok;
    }

    Quant aux vector, je n'ai pas encore appris à m'en servir.

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    Si ton cpp est complet il manque #include "Facebook.h". Mais pas dans le .h il faut le mettre dans le cpp

  17. #17
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    J'ai toujours les mêmes erreurs en mettant #include "facebook.h" dans personne.cpp

  18. #18
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Salut,

    Plusieurs remarques:
    * nbPers, Max et fb sont des attributs de ta classe Facebook
    * Si tu as le droit, utilise std::vector plutôt qu'un tableau. J'avais mal lu la remarque de GéantVert...

    Edit:
    Je pense que ta méthode Personne::inscription() devrait plutôt être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool Personne::inscription(Facebook& fb)
    {
      return fb.addPersonne(*this); //où addPersonne est une méthode de Facebook qui ajoute une personne.
    }

  19. #19
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    Il te faut une instance de Facebook. Si c est fb, où est elle déclarée ? Après ça ne marchera toujours pas puisque tu accède à des attributs prives de Facebook. Suit le conseil de darkman. Ce n est pas le rôle de personne d ajouter une personne au tableau de Facebook.

  20. #20
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Salut darkman19320,

    La méthode inscription a pour seul but de déterminer s'il reste de la place dans le réseau et si une Personne de même nom et prénom n'existe pas déjà (c'est ce que l'énoncé me demande ^^).

    Mon énoncé me dit également ceci :
    "Pour pouvoir travailler avec la classe Facebook dans la classe Personne, il faut faire une
    déclaration de la façon suivante dans le fichier personne.h
    class Facebook ;
    class Personne{

    } ;"

    Cette déclaration me permet-elle normalement d'utiliser les attributs de Facebook dans Personne ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Erreur avec une classe
    Par 16gsyncro dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/05/2010, 12h40
  2. [POO] Erreur de syntaxe avec une classe
    Par sirbaldur dans le forum Langage
    Réponses: 5
    Dernier message: 10/01/2007, 13h30
  3. [C#][WebServices] Appel methode avec une classe en paramètre
    Par bran_noz dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/09/2004, 16h41
  4. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45
  5. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15

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