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 :

Point ou flèche ?


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Point ou flèche ?
    Bonjour,

    je débute en C++ et j'aimerai juste savoir la différence entre, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::vector<Objet> listeObjet;
    Objet objet;
    objet.setNom("test");
    listeObjet.push_back(objet);
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::vector<Objet> listeObjet;
    Objet *pointeurSurObjet = new Objet();
    pointeurSurObjet ->setNom("test");
    listeObjet.push_back(*pointeurSurObjet );
    Je vois pas trop, dans le premier exemple c'est comme en gros si on ajoutait une structure en C dans une liste et dans le second cas alors c'est un pointeur sur une structure ? Mais dans le second cas on ne peux pas ajouter l'adresse de cette structure dans la liste, on met une * pour ajouter que sa valeur ? De plus comme on ajoute sa valeur on n'est pas obligé de parcourir la liste pour faire des "delete" sur les objets pointés ?

    Merci beaucoup !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    C'est ce qu'on appelle un pointeur et déférencement.
    Et ton vector contient des objets, push_back ajoute une copie de l'objet. Ton 2° code est surtout source de leak et ne devrait pas être écrit.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Déjà, de manière générale, les mutateur (setXXX, comme ton setNom), c'est à éviter autant que possible, car c'est souvent le symptome du fait que tu penses à tes classes en fonction des données qu'elles contiennent au lieu d'y penser en termes de services attendus de leur part.

    De plus, le nom de (quoi que ce soit) va souvent servir (seul ou accompagné d'autre donnée) d'"identifiant unique" pour chaque instance particulière de tes classes, si bien que la modification du nom d'une instance particulière risque très fort d'avoir un impact particulièrement négatif sur le reste de ton programme.

    Du coup, il est donc très largement préférable de le définir une bonne fois pour toute (au travers du constructeur de ta classe) et ... de ne pas permettre à l'utilisateur de ta classe d'aller le modifier par la suite

    Ensuite, ton deuxième code est, purement et simplement faux!!! Il y a deux raisons à cela :
    1. Il occasionne une fuite mémoire, car, dés que tu vas sortir de la fonction qui contient se code, tu vas perdre l'adresse mémoire représentée par pointeurSurObjet, et tu ne pourras donc plus libérer la mémoire qui a été allouée à ce pointer. Si cela se reproduit trop souvent, c'est la stabilité de tout le système (l'ordinateur, le serveur sur lequel s'exécute l'application) qui sera mise en péril!
    2. De manière générale, on n'utilise l'allocation dynamique de la mémoire (que l'on préférera faire au travers de pointeurs intelligents) uniquement pour les classes qui ont sémantique d'entité, et ces classe sont -- par nature -- non copiable, or, ce code occasionne une copie de l'élément pointé par pointeurSurObjet, ce qui est contradictoire

    Enfin, pour quand même répondre à ta question... De toute évidence, tu as tété à la mamelle du java avant de t'intéresser au C++. A titre perso, j'aurais préféré l'inverse, mais bon...

    Si je ne m suis pas trompé et que tu viens de java (ou de C#), il faut savoir qu'il y a trois différences fondamentales entre C++ et ces deux langages :
    1. Contrairement à java et à C#, C++ n'a pas de "ramasse miette" (garbage collector)et,
    2. contrairement à ces deux langages, lorsque tu utilise le mot clé class en C++, il n'y a pas d'héritage implicite avec une quelconque classe Object.x
    3. alors que tu manipule systématiquement des référence en java, C++ te permet de manipuler des valeurs, des références et des pointeurs (par défaut, on manipule des valeurs )


    En fait, si on est obligé d'utiliser un code proche de MyObject obj = new MyObject; en java, c'est pour que la machine virtuelle puisse "enregistrer" obj au niveau du garbage collector, et c'est ce qui nécessite une relation d'héritage avec cette fameuse classe Object.

    En C++, comme il n'y a pas de garbage collector, il n'y a aucune raison d'avoir un héritage implicite avec une quelconque classe Object, et c'est d'autant plus vrai que la philosophie du C++ est pay only for what you use (ne payez que pour ce que vous utilisez).

    En C++, on manipule des valeurs par défaut, alors que l'on manipule (implicitement) des référence ne java. Mais, si on ne veut pas manipuler des valeurs, on préféra utiliser des références plutôt que des pointeurs (pour le passage d'argument à une fonction, par exemple), car les référence présente une garantie que le pointeur ne fourni pas : l'objet référencé par une référence doit obligatoirement exister lors de la création d'une référence, alors qu'un pointeur peut pointer sur une adresse connue comme "ne pointant sur aucun élément valide".

    Dés lors, tu as deux solutions :
    1. Soit la classe que tu crée a sémantique de valeur, et c'est bel et bien le premier code que tu as donné qui doit être utilisé (à ceci près qu'il faut "cacher ce setNom que je ne saurais voir")
    2. Soit la classe que tu crée a, effectivement, sémantique d'entité, et l'idée sera de créer un tableau de... pointeurs intelligents, par exemple sous une forme proche de (!!! compilateur supportant C++14 requis)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
       
      std::vector<std::unique_ptr<Object> listeDePointeurs;
      auto ptr = std::make_unique<MyObject>("le nom de mon objet"); // MyObject hérite de Object
      listeDePointeur.emplace_back(std::move(ptr));
      (d'autres manières sont possibles )

    Hé oui, autre langage, autres habitudes à prendre... Et, si tu veux mon avis, il est primordial de prendre les bonnes habitudes le plus vite possible
    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

Discussions similaires

  1. [8] Pointe de flèche sur un flash permettant de dessiner
    Par guietfa dans le forum ActionScript 1 & ActionScript 2
    Réponses: 14
    Dernier message: 11/02/2016, 14h50
  2. Réduire la taille des pointes des flèches
    Par Paul Pit dans le forum MATLAB
    Réponses: 0
    Dernier message: 09/07/2014, 17h16
  3. Réponses: 2
    Dernier message: 28/06/2013, 11h21
  4. Conversion flèche et point d'interrogation
    Par sam01 dans le forum Langage
    Réponses: 2
    Dernier message: 15/06/2010, 13h12
  5. Quiver, pointes de flêches trop large!
    Par weedcat dans le forum MATLAB
    Réponses: 3
    Dernier message: 27/04/2009, 08h06

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