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 :

Graphe générique C++


Sujet :

C++

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 1
    Par défaut Graphe générique C++
    Bonjour à tous,

    Je suis bloqué depuis une semaine sur ce programme et j’espère que vous allez pouvoir m'aider.
    Je doit réaliser un graphe générique en c++.
    Voila comment je fait les choses.

    Pour le graphe générique en lui même j'ai trois templates GGraphe, GSommet, GArete déclaré de la manière suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    template <typename TGraphe, typename USommet, typename VArete >
     
    class GGraphe{
    C'est la première fois que je fait de la généricité en c++ alors déjà est ce que la déclaration des classes ce fait bien comme ça avec des templates ?

    Ensuite est ce que dans l'implémentation chaque méthodes doit avoir écrit a nouveau template et les trois types génériques que je vais utiliser de la manière suivante ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    template <typename TGraphe, typename USommet, typename VArete>
        GGraphe<TGraphe, USommet, VArete>::GGraphe() {
        }
    Maintenant la partie où je bloque.
    On suppose maintenant que un utilisateur souhaite créer des classes qui héritent du graphe générique. Donc l'utilisateur crée trois classes (par exemple) Molecule, Atom, Arete. Pour chaque classes il fait hérité la classe générique correspondante. Pour Molecule : GGraphe.

    Je déclare la classe comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    class Molecule : virtual public GGraphe <Molecule, Atom, Liaison>{
    C'est ici que j'ai un problème. Quand je compile il me dit que "Molecule" n'est pas définit, en effet puisqu'il est en train de compiler la classe Molecule donc elle n'existe pas encore. J'ai alors essayer de mettre ca juste avant de déclarer la classe.

    Et alors il le compilateur me dit qu'il ne connait pas les méthodes qui sont dans la classe Molecule.

    Voila

    Est ce que vous pouvez m'apporter votre aide ?
    Merci d'avance.

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Phuy38 Voir le message
    Bonjour à tous,

    Je suis bloqué depuis une semaine sur ce programme et j’espère que vous allez pouvoir m'aider.
    Je doit réaliser un graphe générique en c++.
    Voila comment je fait les choses.

    Pour le graphe générique en lui même j'ai trois templates GGraphe, GSommet, GArete déclaré de la manière suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    template <typename TGraphe, typename USommet, typename VArete >
     
    class GGraphe{
    Mmmmoui... Peut-être.

    Citation Envoyé par Phuy38 Voir le message
    C'est la première fois que je fait de la généricité en c++ alors déjà est ce que la déclaration des classes ce fait bien comme ça avec des templates ?
    Oui. Tu peux utiliser class en lieu et place de typename (synonyme et sémentiquement plus juste, à moins que GArete puisse être un int).

    Citation Envoyé par Phuy38 Voir le message
    Ensuite est ce que dans l'implémentation chaque méthodes doit avoir écrit a nouveau template et les trois types génériques que je vais utiliser de la manière suivante ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    template <typename TGraphe, typename USommet, typename VArete>
        GGraphe<TGraphe, USommet, VArete>::GGraphe() {
        }
    Tu peux aussi définir les fonctions dans le corps de la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    template <class Graph, class Vertex, class Link>
    class graph
    {
    public:
        graph()
        {
           ...
        }
    };
    Pour les fonctions qui ne sont pas trop longue, ça sera moins lourd à gérer.

    Citation Envoyé par Phuy38 Voir le message
    Maintenant la partie où je bloque.
    On suppose maintenant que un utilisateur souhaite créer des classes qui héritent du graphe générique. Donc l'utilisateur crée trois classes (par exemple) Molecule, Atom, Arete. Pour chaque classes il fait hérité la classe générique correspondante. Pour Molecule : GGraphe.

    Je déclare la classe comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    class Molecule : virtual public GGraphe <Molecule, Atom, Liaison>{
    C'est ici que j'ai un problème. Quand je compile il me dit que "Molecule" n'est pas définit, en effet puisqu'il est en train de compiler la classe Molecule donc elle n'existe pas encore. J'ai alors essayer de mettre ca juste avant de déclarer la classe.
    Que veut dire cette déclaration ? Une molécule est un graphe de molécule ?

    Il me semblait que c'était un graphe d'atomes.

    Je met le doigt sur ce qui me gène dans ta déclaration ci dessus : template <typename TGraphe, typename USommet, typename VArete> class CGraphe;

    Pourquoi est-ce que la classe graphe est définie à partir d'un graphe ? Ca na pas vraiment de sens. Un graphe est une entité composée de sommets et d'arrêtes qui lient ces sommets (des liens). Un lien a des propriétés (arbitraire + sens si le lien est directionnel), et les sommets ont des propriétés arbitraires aussi - donc il est logique que les deux soient traités de manière génériques par ta définition. Mais le paramètre TGraphe, à quoi sert-il ? La, je ne comprends pas.

    Citation Envoyé par Phuy38 Voir le message
    Et alors il le compilateur me dit qu'il ne connait pas les méthodes qui sont dans la classe Molecule.
    Et pour cause. Tu crée un lien cyclique indirecte entre Molecule et elle-même, et ce lien indirect a besoin de connaître Molecule. Ca ne peut pas marcher
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    Par défaut
    Salut,

    J'ai l'impression que tu fais plus compliqué que nécessaire, tu as juste besoin de définir une classe générique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <class vertex_type, class edge_type >
    class graph{
    ......
    }
    Après, pour représenter ta molécule, il faut te demander quel type va représenter tes atomes et quel type va représenter tes liaisons. Le plus simple, selon moi, est d'utiliser des std::string pour les deux, même si en terme de performance c'est tout pourri ça à le mérite d'être peut être plus intuitif.
    Ainsi si tu veux faire un graphe qui représente une molécule tu peux faire un typedef :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef graph<std::string, std::string> molecule;
    Est-ce que tu pourrais donner plus de code, qu'est ce qu'il y a d'implémenté à l'intérieur de ta classe ?
    Quel type de molécule tu souhaites représenter ?
    Peut-il y avoir plusieurs liaisons entre deux atomes (du coup ce n'est plus un graphe mais un multigraphe, la complexité augmente) ?

    Choisir une structure de graphe n'est pas forcément évident et dépends vraiment de ta problématique.

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/01/2015, 00h51
  2. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  3. [Turbo Pascal] [Windows XP] Problème avec l'unité GRAPH
    Par themofleur dans le forum Turbo Pascal
    Réponses: 22
    Dernier message: 29/03/2003, 22h43
  4. [] [Excel] Exporter un graphe MSChart vers Excel
    Par Gonzo dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/12/2002, 17h49
  5. Concerne les graphes
    Par mcr dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 12/11/2002, 11h02

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