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 :

Construction d'une classe - Exemple de C++ for Dummies


Sujet :

C++

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut Construction d'une classe - Exemple de C++ for Dummies
    Bonjour,

    Voilà, aujourd'hui, sur le chat du site ( il y a le lien, juste au dessus ), on me montre cette ligne là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Student& student = *new Student;
    Qui vient de cet exemple là:
    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
     
    class Student
    {
      public:
        int semesterHours;
        float gpa;
        Student valFriend;
        Student& refFriend;
        Student* ptrFriend;
    };
    int main(int nNumberofArgs, char* pszArgs[])
    {
        // the following declares a reference off of the heap
        // (simple enough)
        Student& student = *new Student;
        student.gpa = 10;
        // ditto
        Student& studentFriend = *new Student;
        studentFriend.gpa = 20;
        // the following copies the value of one Student
        // object into the second
        student.valFriend = studentFriend;
        // this doesn't work at all
        Student& refFriend;
        refFriend = studentFriend;
        // this does work
        student.pFriend = &studentFriend;
        return 0;
    }
    Cela me laisse vraiment perplexe.
    Déjà que l'écriture me semble un peu bancale (même si après réflexion je l'a comprends), car personnellement j'écris ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Student* student = new Student();
    Donc si vous pouviez m'expliquer les avantages d'une telle écriture ( celle du livre ) je vous en serai reconnaissant.

    Merci d'avance
    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.

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Donc si vous pouviez m'expliquer les avantages d'une telle écriture ( celle du livre ) je vous en serai reconnaissant.
    Favoriser les fuites mémoires, car personne ne va penser à appeler delete sur l'adresse d'une référence. Problème très bien illustré d'ailleurs dans l'exemple (les instances ne sont jamais détruites).

  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
    Points : 13 017
    Points
    13 017
    Par défaut
    Comme dit Laurent, c'est plutôt une écriture que je déconseillerais. Mais tu dis que c'est tiré d'un livre ? Peut être illustre-t-elle autre chose sur les références et l'exemple n'est là que dans un but didactique. Il faudrait voir le blabla avant et après. Les exemples sont souvent 'corrects' que dans le cadre du discours dans lequel ils s'inscrivent.

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Mais, pour ce problème de fuite, est ce que le programme ne vas pas voir la variable comme une variable locale ( même si cela a été crée comme un pointeur ) et donc va être normalement détruit ( car le programme va détruire les variables locales, donc sous entendu les variables crées par les new ) ? Ou je suis complètement à coté de la plaque...
    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
    Responsable 2D/3D/Jeux


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Le texte associé:
    As you can see, I modified that Student class so that one Student can reference her best buddy. I tried to use the reference variable type to do so. I created two students in main() in an attempt to link the one student object to its studentFriend.
    The first assignment in the body of the program copies the contents of the friend into the data member -- Student object contains a body double. The second assignment doesn't work at all -- C++ can't differentiate assigning an object to a reference variable from assignment to an object itself. Only the third assignment works. The student object points to the address of the studentFriend, which is exactly what you want.
    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.

  6. #6
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Mais, pour ce problème de fuite, est ce que le programme ne vas pas voir la variable comme une variable locale ( même si cela a été crée comme un pointeur ) et donc va être normalement détruit ( car le programme va détruire les variables locales, donc sous entendu les variables crées par les new ) ? Ou je suis complètement à coté de la plaque...
    Il n'y a rien d'aussi tordu en C++, tout ce qui est alloué avec new doit être désalloué avec delete, c'est pas plus compliqué.

    Peut être illustre-t-elle autre chose sur les références et l'exemple n'est là que dans un but didactique.
    Ca a l'air d'être le cas, mais ça n'excuse pas une telle erreur. D'autant plus qu'il aurait très bien pu déclarer les instances sur la pile, l'utilisation de new n'est absolument pas justifiée ici.

  7. #7
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    Il n'y a rien d'aussi tordu en C++, tout ce qui est alloué avec new doit être désalloué avec delete, c'est pas plus compliqué.
    Pour illustrer, je dirais que Type& doit être vu comme Type* : une place est réservée dans la pile pour contenir une référence et c'est cette place qui est libérée. Pas la référence qu'elle désigne.

    Citation Envoyé par Laurent Gomila Voir le message
    Ca a l'air d'être le cas, mais ça n'excuse pas une telle erreur. D'autant plus qu'il aurait très bien pu déclarer les instances sur la pile, l'utilisation de new n'est absolument pas justifiée ici.
    Oui. Et d'autant que le texte que présente LittleWhite montre que ça n'a rien à faire. Ce choix, surtout si le titre est C++ for Dummies, est, disons, assez maladroit
    Et en fait, en regardant l'exemple, c'est ou une erreur de copier/coller ou carrément n'importe quoi : la classe Student a un membre référence et aucun constructeur pour l'initialiser -> ça ne compile pas. Plus bas refFriend est une référence non initialisée -> même punition. En fait, j'ai l'impression qu'il (l'auteur du livre) ne sait pas trop quoi expliquer et du coup il le fait mal. Bref, à la vue de cet exemple, j'aurais tendance à ne pas recommander ce livre

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

Discussions similaires

  1. Construction d'une classe de type SoapClient
    Par Arjuna dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 07/08/2012, 17h02
  2. Réponses: 0
    Dernier message: 21/07/2008, 13h49
  3. Réponses: 6
    Dernier message: 07/03/2006, 10h51
  4. Problème de construction d'une classe
    Par AraBorLeg dans le forum Langage
    Réponses: 2
    Dernier message: 05/12/2005, 19h07
  5. construction d'une classe
    Par r0d dans le forum C++
    Réponses: 10
    Dernier message: 16/09/2004, 17h35

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