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

Langage C++ Discussion :

Pointeur vers l'object conteneur parent.


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Par défaut Pointeur vers l'object conteneur parent.
    Bonjour,

    Voila, cela fait un moment que je bute sur un problème qui a l'air plutot simple.

    Je désirerais créer deux objets :
    - le premier est un conteneur contenant une liste du deuxième objet
    - le deuxième objet est un objet quelconque mais possédant un pointeur vers son parent.

    J'ai donc essayé de faire un petit essai :

    parent.cpp et item.cpp :
    parent.hpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef PARENT_HPP
    #define PARENT_HPP
     
    #include <vector>
    #include "item.hpp"
     
    using namespace std;
     
    class Parent : public vector<Item>{};
     
    #endif /* PARENT_HPP */
    item.hpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef ITEM_HPP
    #define ITEM_HPP
     
    class Item {};
     
    #endif /* ITEM_HPP */
    Cela compile donc très bien.

    Maintenant il suffirait suivant ce que je souhaiterai faire de rajouter un pointeur dans chaque item pour pointer ves le parent. Je commence donc par rajouter dans item.hpp un include vers parent.hpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef ITEM_HPP
    #define ITEM_HPP
     
    #include "parent.hpp"
     
    class Item {};
     
    #endif /* ITEM_HPP */
    Mais la le code ne compile plus. Et j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    In file included from item.hpp:4,
                     from item.cpp:1:
    parent.hpp:9: erreur: ‘Item’ was not declared in this scope
    parent.hpp:9: erreur: patron de l'argument 1 est invalide
    parent.hpp:9: erreur: patron de l'argument 2 est invalide
    Voila, je désirais faire comme cela car c'est en gros cette technique que j'utilisais en C#. Je créais le pointeur dans l'item et ensuite je surchargeais les méthodes d'ajout et de suppression d'item dans les parents pour qu'il affecte à l'item rajouté le nouveau parent.

    Donc je ne sais pas comment faire en C++. Si quelqu'un peut m'aider à résoudre mon problème de compilation ou peut m'orienter vers une autre technique plus utilisée en C++ ...

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Je vais commencer par quelques détails embêtant:

    1. On ne place au grand jamais une directive using namespace de manière globale dans un fichier d'en-tête (hpp)
    2. On ne fais jamais hériter une classe d'un conteneur de la STL


    (1) une telle directive a la mauvaise idée de se répandre "comme une trainée de poudre" du fait du jeu des inclusions en cascades

    Pour se passer de la directive, rien de plus simple: préfixe le noms des types manipulés par std::

    (2) Les destructeurs des conteneurs de la STL ne sont pas virtuels.

    D'ailleurs aucune fonction membre des conteneurs ne l'est...

    Ce qui fait que le polymorphisme ne s'applique pas et que, si, pour une raison ou une autre, tu en viens à décider de considérer un pointeur de type Parent comme étant en fait un pointeur de type vector<Item> (ce qui est ton droit, du fait de l'héritage), lorsque tu détruira l'objet pointé par le pointeur de type vector<Item>, le destructeur de Parent ne sera pas appelé.

    Il peut en découler une série de problèmes pour le moins... agaçants

    La solution (qui sera d'ailleurs sémantiquement bien plus correcte) passe par une aggrégation tout ce qu'il y a de plus simple, en veillant à respecter demeter et à ne pas exposer de la classe vector plus que le nécessaire

    Cela prendra une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Parent
    {
        public:
            /* les fonctions qui sont intéressante dans le cadre de Parent */
        private:
            std::vector<Item> children_;
    };

    Pour le reste, ton problème est à ce point récurrent qu'il y a une entrée dans la FAQ qui explique comment le résoudre
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Par défaut
    Ok merci beaucoup pour la résolution de mon problème et désolé de ne peut-être pas avoir cherché assez.

    1. On ne place au grand jamais une directive using namespace de manière globale dans un fichier d'en-tête (hpp)
    2. On ne fais jamais hériter une classe d'un conteneur de la STL
    Par contre, très content d'avoir appris cela. Merci beaucoup.

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par laflak Voir le message
    Ok merci beaucoup pour la résolution de mon problème et désolé de ne peut-être pas avoir cherché assez.



    Par contre, très content d'avoir appris cela. Merci beaucoup.
    C'est bien de l'avoir appris, mais si mes explications sont un peut trop lapidaires, n'hésite pas à demander plus de précision
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. pointeur vers noeud parent dans un arbre
    Par alaninho dans le forum C++
    Réponses: 5
    Dernier message: 06/11/2012, 16h23
  2. Utilité d'un pointeur vers une fonction ?
    Par Nasky dans le forum C
    Réponses: 10
    Dernier message: 20/03/2010, 19h54
  3. Réponses: 10
    Dernier message: 28/08/2008, 13h00
  4. Pointeur vers fonction
    Par flopaname dans le forum Langage
    Réponses: 3
    Dernier message: 23/06/2005, 15h46
  5. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43

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