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 :

Sommet et arêtes


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 70
    Par défaut Sommet et arêtes
    Bonjour,

    Je suis en train de créer une arête et un sommet, mais comme vous pouvez le voir j'ai un problème
    que je ne comprends pas, lorsque j'utilise "ajoutArete"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C:\Users\Administrator\Documents\CodeBlocks-C++\GrapheVersionFinal\main.cpp|24|error: variable 'Arete nouvArete' has initializer but incomplete type|

    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
     
    #include <iostream>
    #include <string>
    #include <vector>
     
    //#include "Arete.h"
    //#include "Sommet.h"
     
    using namespace std;
     
    class Arete;
     
    class Sommet
    {
        private:
            string nom;
            vector<Arete> aretes;
        public:
            Sommet(string s_nom)
            {
                this->nom=s_nom;
            }
            void ajoutArete(Sommet *s,int valu)
            {
                 Arete nouvArete(this,s,valu);
               // aretes.push_back(nouvArete);
            }
     
             ~Sommet(){};
    };
     
    class Arete
    {
        private:
        Sommet *sOrigine;
        Sommet *sDestination;
        long valuation;
     
        public:
            Arete(const Sommet& s_Origine,const Sommet& s_Destination,int s_valuation)
            {
                sOrigine=new Sommet(s_Origine);
                sDestination=new Sommet(s_Destination);
                this->valuation=s_valuation;
            }
            ~Arete(){};
     
    };
     
    int main()
    {
        Sommet s1("paris");
        Sommet s2("berlin");
     
        Arete a1(s1,s2,878.04);
     
        return 0;
    }

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Une bonne pratique, et, qui je pense, vous évitera ce genre de soucis est de faire un couple de fichier .hpp/.cpp par classe. Donc, des fichiers Arete.cpp/Arete.hpp et des fichiers Sommet.cpp/Sommet.hpp
    Ensuite, vous placez les implémentation (le code) des fonctions dans les CPP et les définition/déclaration des classes dans les .hpp.

    Pour l'erreur, elle indiquait simplement que le compilateur ne peut pas utilisé le type "Arete" car il ne connait pas l'intégralité du type. En effet class Arete; permet bien de dire au compilateur que le type existe, mais ne lui permet pas vraiment de l'utiliser (car il sait juste qu'il existe et non ce qu'il contient ou ce qu'il est).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 70
    Par défaut
    Justement je travaille avec les fichiers séparés normalement,
    mais j'ai des erreurs que je ne comprends pas.
    C'est à dire que c'est la première fois que j'utilise deux classes qui sont interdépendante,
    ce que je veux dire par la c'est que "sommet" contient des "arêtes" et les "arêtes" contiennent des "sommet"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    include\Sommet.h|26|error: 'Arete' was not declared in this scope|
    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
     
    #ifndef SOMMET_H
    #define SOMMET_H
     
    #include <string>
    #include <vector>
     
    #include "Arete.h"
     
    using namespace std;
     
    class Sommet
    {
        public:
            Sommet(string s_nom)
            {
                this->nom=s_nom;
            }
            void ajoutArete(Sommet *s,int valu)
            {
                 Arete nouvArete(this,s,valu);
               // aretes.push_back(nouvArete);
            }
             ~Sommet(){};
        private:
            string nom;
            vector<Arete> aretes;
    };
     
    #endif // SOMMET_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
     
    #ifndef ARETE_H
    #define ARETE_H
     
    #include <string>
    #include <vector>
     
    #include "Sommet.h"
     
    using namespace std;
     
    class Arete
    {
        public:
            Arete(const Sommet& s_Origine,const Sommet& s_Destination,int s_valuation)
            {
                sOrigine=new Sommet(s_Origine);
                sDestination=new Sommet(s_Destination);
                this->valuation=s_valuation;
            }
            ~Arete(){};
        private:
        Sommet *sOrigine;
        Sommet *sDestination;
        int valuation;
     
    };
     
    #endif // ARETE_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
     
    #include <iostream>
    #include <string>
    #include <vector>
     
    #include "Arete.h"
    #include "Sommet.h"
     
     
    using namespace std;
     
    int main()
    {
        Sommet s1("paris");
        Sommet s2("berlin");
     
        Arete a1(s1,s2,878.04);
     
        return 0;
    }

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Je répète mon conseil : mettez l'implémentation des constructeurs/destructeurs, dans des .cpp et non dans le .hpp. Je crois que c'est la raison.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 70
    Par défaut
    C'est bon j'ai changé, mais les erreurs restent les mêmes à par si j'ai mal fait
    le rajout des fichiers

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ||=== Build: Debug in GrapheVersionFinal (compiler: GNU GCC Compiler) ===|
    include\Sommet.h|20|error: 'Arete' was not declared in this scope|
    include\Sommet.h|20|error: template argument 1 is invalid|
    include\Sommet.h|20|error: template argument 2 is invalid|
    ||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
    Arete.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 ARETE_H
    #define ARETE_H
     
    #include <string>
    #include <vector>
     
    #include "Sommet.h"
     
    using namespace std;
     
    class Arete
    {
        public:
            Arete(const Sommet& s_Origine,const Sommet& s_Destination,int s_valuation);
            ~Arete();
        private:
        Sommet *sOrigine;
        Sommet *sDestination;
        int valuation;
    };
     
    #endif // ARETE_H
    Arete.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include "Arete.h"
     
    Arete::Arete(const Sommet& s_Origine,const Sommet& s_Destination,int s_valuation)
    {
        sOrigine=new Sommet(s_Origine);
        sDestination=new Sommet(s_Destination);
        this->valuation=s_valuation;
    }
     
    Arete::~Arete()
    {
        //dtor
    }
    Sommet.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
     
    #ifndef SOMMET_H
    #define SOMMET_H
     
    #include <string>
    #include <vector>
     
    #include "Arete.h"
     
    using namespace std;
     
    class Sommet
    {
        public:
            Sommet(string s_nom);
            void ajoutArete(Sommet *s,int valu);
     
             ~Sommet();
         private:
            string nom;
            vector<Arete> aretes;
    };
     
    #endif // SOMMET_H
    Sommet.cpp
    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
     
    #include "Sommet.h"
     
    Sommet::Sommet(string s_nom)
    {
        this->nom=s_nom;
    }
     
    Sommet::~Sommet()
    {
        //dtor
    }
     
    Sommet::ajoutArete(Sommet *s,int valu)
    {
                 Arete nouvArete(this,s,valu);
               // aretes.push_back(nouvArete);
    }
    main
    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
     
    #include <iostream>
    #include <string>
    #include <vector>
     
    #include "Arete.h"
    #include "Sommet.h"
     
     
    using namespace std;
     
    int main()
    {
        Sommet s1("paris");
        Sommet s2("berlin");
     
        Arete a1(s1,s2,878.04);
     
        return 0;
    }

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Un début de solution est présent ici, dans la FAQ : http://cpp.developpez.com/faq/cpp/?p...iers-d-en-tete
    Il vous faudra une troisième classe/fichier afin de faire comme un intermédiaire. Car là, regardez vos include, sachant que le préprocesseur, lorsqu'il voit un "include", il faut bêtement un copier coller, je peux vous dire que vous avez quelques soucis avec le fichier final (qui est compilé).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Comme personne ne dit rien et que LittleWhite galère je réponds

    Pour cette erreur
    Citation Envoyé par bouritosse Voir le message
    Bonjour,

    Je suis en train de créer une arête et un sommet, mais comme vous pouvez le voir j'ai un problème
    que je ne comprends pas, lorsque j'utilise "ajoutArete"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C:\Users\Administrator\Documents\CodeBlocks-C++\GrapheVersionFinal\main.cpp|24|error: variable 'Arete nouvArete' has initializer but incomplete type|
    Lorsqu'on manipule un objet d'un type autre que pointeur (et éventuellement référence, mais je n'en suis pas sûr ), le C++ exige d'avoir la déclaration complète (il doit connaître au moins sa taille, ces constructeurs, son destructeur).
    Tu as fait une déclaration anticipée (forward declaration) de ton type Arete, mais tu manipules un vrai objet Arete.

    Sinon
    • Mettre l'implémentation de tes méthodes dans les entêtes (fichier .h/ .hpp) permet de faire des méthodes inline implicites. Tu peux tout également utiliser dans la déclaration de ta méthode le mot clef inline et l'implémenter dans le fichier source (fichier .cpp)
    • Avec les template, le compilateur doit avoir la déclaration complète en permanence (en C++, on include des fichiers, on ne les exporte pas). Donc, tu dois coder toute l'implémentation de ta classe template dans les entêtes. Une technique consiste à faire un 3ième fichier (fichier .tpp), d'y coder l'implémentation et de faire un include en fin d'entête de ce fichier.


    Ne mets pas de using namespace std dans un fichier header (.h/ .hpp)

    Je me demande si ce n'est pas ta façon de coder ou ta logique qui est mauvaise
    J'ai le souvenir, dans le temps , que je faisais 2 tableaux 1 d’arêtes et 1 de sommets, et que pour tout j’utilisais des index de tableau.
    Une arête c'était déjà 2 index de tableau de sommets.

    Par exemple:
    Citation Envoyé par PilloBuenaGente Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            Arete(const Sommet& s_Origine,const Sommet& s_Destination,int s_valuation)
            {
                sOrigine=new Sommet(s_Origine);
                sDestination=new Sommet(s_Destination);
                this->valuation=s_valuation;
            }
    Tu va créer X fois un même sommet

Discussions similaires

  1. Surfaces, arêtes et sommets
    Par bob53 dans le forum OpenSceneGraph
    Réponses: 3
    Dernier message: 14/05/2012, 11h00
  2. Dijkstra : Sommet et Arêtes parcouru
    Par Bob Hazelton dans le forum Langage
    Réponses: 1
    Dernier message: 30/12/2009, 15h02
  3. Calcul du plu court chemin entre 2 sommets d'un graphe valué
    Par atlasm dans le forum Algorithmes et structures de données
    Réponses: 25
    Dernier message: 07/08/2005, 17h06
  4. dessin d'un arc entre deux sommet
    Par yesra dans le forum C++Builder
    Réponses: 3
    Dernier message: 24/04/2004, 16h43
  5. états de l'art serveurs OLAP ????
    Par greatmaster1971 dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 17/10/2003, 13h53

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