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 :

pointeur vers une autre classe


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut pointeur vers une autre classe
    Bonjour,

    Je voulais revenir sur ce qu'a dit astraya sur l'allocation dynamique quand il parlais du new : en appliquant ceci à la POO "pointeur d'une classe vers une autre classe" : en prenant un petit exemple vite fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class bibi
    {
    (...)
    }
    class gégé
    {
    bibi *bibiobj
    }
    (...)
    gégé::gégé()
    {
    bibiobj=new bibi;
    }
    On suppose que les classes bibi et gégé n'ont aucun lien 'mère/fille'.
    Que se passe-t-il ici ? Je crée un objet *bibiobj depuis la classe bibi...
    Le pointeur bibiobj est un membre de la classe gégé ayant pour type bibi* ...
    ? Et le new renvoie l'adresse mémoire de objet pointé *bibiobj ?
    Ca me paraît bizarre... Non ?
    Et tu dis aussi que le pointeur ne réserve rien pour lui-même : pourtant si l'on en croit ce tuto sur les pointeurs, un emplacement mémoire est bel et bien réservé pour px... ça me paraît d'autant plus bizarre...

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je vais prendre des noms de classe plus explicites, ce sera un peu plus clair.
    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
    class Point3D
    {
      private:
        float X,Y,Z;
      public:
        Point3D(); 
        Point3D(float x, float y, float z) {X=x; Y=y; Z=z;} 
    };
    class TForme
    {
      ...
      piblic;
        TForme();  // constructeur : crée un objet TForme
    };
    class Symbole
    {
      private:
        Point3D *Origine;
        Point3D *Direction;
        TForme *LaForme;
      public:
        Symbole(Point3D* p1, Point3D* p1, Symbole* S);
    };
    Ces 3 classes n'ont aucun rapport direct entre elles.
    Durant le traitement, il y aura probablement une grande quantité de points, indépendants les uns des autres et utilisés par toute sorte d'objets, dont les symboles.
    La classe TForme définit des objets qui sont extérieurs au traitement en cours.
    Un objet Symbole est un objet ponctuel, ayant une origine, une direction et une forme.
    La création d'un symbole pourra se faire de la façon suivante :
    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
    Symbole::Symbole(Point3D* p1, Point3D* p1, TForme* S)
    {
      Origine = p1;
      Direction = p2;
      LaForme = S;
    }
     
    // Dans le traitement
     
      Point3D *P1=NULL; 
      Point3D *P2=NULL;
      TForme *uneForme=NULL;
    /*
    Traitement qui définit P1, P2 et uneForme
    MAintenant ces 3 pointeurs sont non NULL, et ils pointent sur des objets déjà existants ou que l'ont vient de créer. 
    */      
      Symbole *UnSymbole = new Symbole(P1, P2, uneForme);
    // Maintenant UnSymbole a été créé, il occupe une certaine place en mémoire, et il faudra faire 
    delete UnSymbole;
    // quand on n'en aura plus besoin.

  3. #3
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Citation Envoyé par gizmo27 Voir le message
    Et tu dis aussi que le pointeur ne réserve rien pour lui-même : pourtant si l'on en croit ce tuto sur les pointeurs, un emplacement mémoire est bel et bien réservé pour px... ça me paraît d'autant plus bizarre...
    Lorsque l'on déclare une variable, un emplacement mémoire est réservé pour stocker la valeur de ladite variable.
    La valeur d'un pointeur est l'adresse des données sur lequel il pointe, pas ces données elles-mêmes.
    Par contre, à l'initialisation, sa valeur n'est pas définie et peut être n'importe quoi ; autrement dit, il peut pointer n'importe où, et pas nécessairement un endroit valide.

    Au final, un pointeur réserve suffisamment d'espace pour stocker une adresse, mais ne réserve pas d'espace pour les données sur lesquelles il est censé pointer par la suite.

  4. #4
    Membre habitué
    Homme Profil pro
    En rupture avec la societé
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : En rupture avec la societé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Points : 194
    Points
    194
    Par défaut
    salut

    Tu défini bibiobj comme un pointeur sur bibi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    gégé::gégé()
    {
    bibiobj=new bibi;
    }
     
    ~gégé::gégé()
    {
    delete bibiobj;
    }
    tu alloue un espace mémoire(déclaration sur le tas).
    tu pointe donc sur une donnée de type bibi.
    Le concept de base est tout pointeur alloué doit être détruit.

    Ta donnée qui pointe sur bibi a bien un espace mémoire réservé et est membre de la class gégé.

    Suivant l'interface que tu déclare, tu pourra utilisé ton objet biblio avec la class.

    dans la declaration
    astraya te l'explique correctement: 'Ne réserve absolument rien, sauf 4 octets pour l'adresse sur quoi il va pointer.' (tu declare sur la pile)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Je ne vais pas vous le cacher et ça n'est pas pour vous contrarier : mais ça m'a l'air assez compliqué à comprendre.
    Il m'a quand même semblé retenir le new renvoie l'adresse de la classe/type qui est stockée dans bibiobj. Je vais laisser ça de côté pour le moment ça m'a l'air d'être de la progra à haut-niveau...
    Merci pour vos réponses. Cordialement, Gizmo.

  6. #6
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 044
    Points : 2 239
    Points
    2 239
    Par défaut
    On suppose que les classes bibi et gégé n'ont aucun lien 'mère/fille'.
    Que se passe-t-il ici ? Je crée un objet *bibiobj depuis la classe bibi...
    Si il n'y a pas de lien mère\fille alors ce n'est pas un héritage, jusque la normal.
    Un pointeur comme tu la fais correspondrais à un agrégation 0...1 d'un point de vu UML. Soit, gégé connais peut-être un bibi.

    Ton gégé n'a pas toute les données de bibi en lui. Il a un pointeur qui vas lui indiquer ou ce trouve en mémoire l'instance de ce bibi. C'est lui qui le créer mais ce n'est pas lui qui détient ces données.N'importe qui d'autre peut instancier un bibi et dire à gégé que c'est ce bibi la qu'il dois connaitre en faisant pointer son pointeur dessus Il a juste une adresse pour savoir ou est donc le bibi qu'il veut.

    Ce que tu as fais est inutile, pour la simple et bonne raison que un pointeur OK. Un new OK, Un delete OK. Mais surtout pas new dans le constructeur et delete dans le destructeur. Une simple variable suffis. Elle aura la durée de vie de gégé.

    Tu vois, si tu oublie de faire le delete. Gégé auras connaissance de bibi, mais si tu détruit gégé, bibi n'est pas détruit. donc fuite mémoire.
    Le pointeur bibiobj est un membre de la classe gégé ayant pour type bibi* ...?
    Le pointeur oui! les données non!

    Et le new renvoie l'adresse mémoire de objet pointé *bibiobj ?
    Oui. Il dit créer moi l'espace mémoire ( le new ) et donne l'adresse de cette espace à ce pointeur ( le = )

    Et tu dis aussi que le pointeur ne réserve rien pour lui-même : pourtant si l'on en croit ce tuto sur les pointeurs, un emplacement mémoire est bel et bien réservé pour px... ça me paraît d'autant plus bizarre...
    Ce que le new créer n'est pas unique pour lui! comme n'importe qu'elle donnée par défaut. La différence avec toutes les autres variables ( instanciation statique "A a;", et reférence "A &a;" ), c'est que le pointeur lui peut allez pointeur sur un autre bibi! et si tu le demande pas au pointeur de détruire le bibi qu'il quitte, il ne seras pas libérer de la mémoire.

    N'oublie pas que tu dois séparer l'adresse et le contenu! Tu peux manipuler des adresses, tu peux manipuler du contenu. Mais attention, car si tu perd l'adresse, tu ne peux pas détruire le contenu car tu ne sais plus ou il ce trouve.
    Homer J. Simpson


  7. #7
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 044
    Points : 2 239
    Points
    2 239
    Par défaut
    Ca me paraît bizarre... Non ?
    Non

    Simple exercice et essaye de donner du code en retour.

    Créer un constructeur automobile.
    Créer deux voitures.
    Créer un propriétaire.

    Un propriétaire peut avoir 2 voitures.
    Une voitures peut avoir 1 propriétaire.

    En mémoire, il te faut, donc un constructeur automobile qui s'occupe de la "recycler", deux voitures et un propriétaire. Rien de plus.

    Ensuite rajoute un autre propriétaire qui récupèreras la voiture du premier propriétaire.
    Fait le et tu comprendras .
    Homer J. Simpson


  8. #8
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Un petit dessin pour faciliter la compréhension ?

    Images attachées Images attachées  

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ben ça c'est sympa d'avoir fait un petit dessin merci beaucoup je ne m'attendais pas à autant. Je suis très surpris (dans le bon sens) merci encore c'est gentil. Bon week-end à tous.

    PS : pour ce qui est du code astraya, je suis en train de regarder : vu que je ne suis pas pro j'aime bien prendre le temps : pas évident à la première lecture : le plus dur est de savoir quoi mettre dans quoi : pour moi c'est un casse-tête mais je relève le défi mdr. Je ne veux aucun indice de plus je veux me débrouiller seul. Bon week-end.
    Dernière modification par Invité ; 19/11/2010 à 12h15.

  10. #10
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 044
    Points : 2 239
    Points
    2 239
    Par défaut
    Un petit dessin pour faciliter la compréhension ?
    Et bé ! tu as le temps de travailler toi?
    Homer J. Simpson


Discussions similaires

  1. [1.x] Appel vers une autre class
    Par lordlifen dans le forum Symfony
    Réponses: 1
    Dernier message: 23/08/2010, 17h18
  2. Réponses: 2
    Dernier message: 27/05/2010, 13h35
  3. Réponses: 3
    Dernier message: 02/03/2010, 08h16
  4. Réponses: 8
    Dernier message: 22/03/2006, 18h24

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