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, Accès aux données ...


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 71
    Par défaut Héritage, Accès aux données ...
    Bonjour,

    Je rencontre un problème pour enregistrer certaines données dans mon arborescence de Classes.

    Mon programme se construit sur 3 classes héritantes :

    Classe A <- Classe B <- Classe C

    Si je construit un objet de classe C, est il possible de l'enregistrer dans la classe A ? Comment accèder à l'objet de classe C à partir de la classe A ?

    Voici mon programme :

    main.cpp : Ici, je désire enregistrer dans classe A l'élément que retourne la fonction Builder.
    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
     
    int main (int argc, char *argv[])
    {
        if (argc > 1)
        {
            ClasseA first = Builder(argv[1]);
     
        }
        else
        {
            cout << "\nVeuillez entrer l' argument." << endl;
        }
     
        cout << endl;
        system("PAUSE");
    }
    Builder.cpp : La est le probleme car j'aimerai retourner un objet de type ClasseA contenant les informations que je crentre dans Test lui même de type ClasseC.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ClasseA ClasseA::Builder(char *nom)
    {
        if (strcmpi(nom,"toto") == 0)
        {
            ClasseC *Test = new ClasseC();
     
            return Test;
        }
    J'espere ne pas être trop confu dans ma demande

  2. #2
    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
    Fais une recherche sur le design pattern "factory", c'est un truc qui revient toutes les semaines.

    En gros l'idée c'est de renvoyer un pointeur sur A* (qui pourra donc très bien pointer sur un C), et d'exploiter ensuite le polymorphisme via des fonctions virtuelles.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 71
    Par défaut
    Merci de ta réponse. J'ai fait quelques recherches via ce forum et Google mais j'avoue que je m'y perd un peu. Et, les expliquation sont quand mêmes assez complexe.
    Pourrais tu me fournir une ébauche d'explication mais orientée vers mon propre problème?

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ici, c'est appelé monteur mais c'est la même chose, en gros.

    http://smeric.developpez.com/java/uml/monteur/

    Faut quand même mettre l'adresse

  5. #5
    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 très simple :

    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
    // Il te faut une classe de base, ici ClasseA visiblement
    class ClasseA
    {
    public :
     
        virtual void DoSomething() = 0;
    };
     
    // ... puis des dérivées
    class ClasseB
    {
    public :
     
        virtual void DoSomething() {cout << "B" << endl;}
    };
     
    class ClasseC
    {
    public :
     
        virtual void DoSomething() {cout << "C" << endl;}
    };
     
    // Ensuite, il faut une factory pour créer les ClasseA en fonction d'un identifiant
    class Factory
    {
    public :
     
        ClassA* Build(const string& Name) const
        {
            if (Name == "ClassB")
                return new ClassB;
            else if (Name == "ClassC")
                return new ClassC;
            else
                return NULL;
        }
    };
     
    // Puis on utilise tout ça
    int main(int argc, char *argv[])
    {
        // On instancie la factory
        Factory Fact;
     
        // On crée une instance selon l'argument passé au programme
        ClassA* C = Factory.Build(argv[0]);
     
        // On utilise notre ClassA* polymorphiquement, càd via ses fonction virtuelles
        if (C)
            C->DoSomething();
     
        return 0;
    }
    C'est vraiment une version de base pour t'expliquer, après typiquement on stocke dans la factory des fonctions de création dans une table associative, on peut aussi rendre la factory générique via l'utilisation de templates, etc... Tu trouveras le code pour tout ça sur le forum, notamment.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 71
    Par défaut
    Super Merci beaucoup, ca marche !

  7. #7
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Salut

    Je pense qu'on pourrait aussi utiliser des références plutôt que des pointeurs... normalement le polymorphisme marche toujours non ?

    et dans le cas où on mets "NULL" on lève une exception, comme ça impossible d'ignorer l'erreur et de risquer le segfault...

    Qu'en pensez-vous, il y a-t-il un risque quelque part ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

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

Discussions similaires

  1. Héritage et accès aux données
    Par spetit dans le forum C++
    Réponses: 24
    Dernier message: 19/07/2006, 18h57
  2. [SGBD]Optimiser le temps d'accès aux données (schéma BD)
    Par vsavoir dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 08/10/2004, 18h33
  3. [débutant] avoir accès aux données de la base BCDI 3
    Par Valichou dans le forum Bases de données
    Réponses: 7
    Dernier message: 06/05/2004, 13h13
  4. accès aux donnée d'un DBGRID
    Par relax_06 dans le forum C++Builder
    Réponses: 4
    Dernier message: 02/03/2004, 23h06
  5. [TDataModule] Intérêt de séparer les accès aux données?
    Par Cornell dans le forum Bases de données
    Réponses: 5
    Dernier message: 05/09/2003, 16h42

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