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 :

référence retournée par une méthode = objet à ne pas garder


Sujet :

C++

Vue hybride

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 79
    Par défaut référence retournée par une méthode = objet à ne pas garder
    Bonjour,

    J'ai entendu dire que lorsqu'une référence vers un attribut est retournée par une méthode, le programmeur C++ sait que c'est un objet à ne pas garder. Je veux dire par là qu'il faut la récupérer dans un bloc, l'utiliser dans ce bloc puis la relacher à la sortie du bloc et ne surtout pas la conserver dans un poiteur (ptr = &ref).

    Cela me serait bien utile dans les cas où un objet donne une const ref vers un de ses attributs (ex: un buffer de pixel), mais qu'il ne veut pas qu'on la conserve pendant plus d'un appel de fonction (ex: qu'on ne conserve la référence vers le buffer que le temps de l'enregistrer dans un fichier), d'autant plus que la référence sera invalide une fois l'objet détruit.

    Qu'est que vous en dites?
    Est ce que vous voyez les références retournées par des méthodes de la même façon???

    Merci de vos réponses!!!

  2. #2
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Bonjour,

    une référence est un pointeur, la durée d'utilisation d'une référence est donc limité à la durée de vie de l'élément référencé.

    s'il s'agit d'une référence vers un attribut d'instance alors la durée d'utilisation est celle de l'instance, si c'est un attribut de classe (static) la chose est immortelle
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par nonozor Voir le message
    Bonjour,

    J'ai entendu dire que lorsqu'une référence vers un attribut est retournée par une méthode, le programmeur C++ sait que c'est un objet à ne pas garder. Je veux dire par là qu'il faut la récupérer dans un bloc, l'utiliser dans ce bloc puis la relacher à la sortie du bloc et ne surtout pas la conserver dans un poiteur (ptr = &ref).

    Cela me serait bien utile dans les cas où un objet donne une const ref vers un de ses attributs (ex: un buffer de pixel), mais qu'il ne veut pas qu'on la conserve pendant plus d'un appel de fonction (ex: qu'on ne conserve la référence vers le buffer que le temps de l'enregistrer dans un fichier), d'autant plus que la référence sera invalide une fois l'objet détruit.

    Qu'est que vous en dites?
    Est ce que vous voyez les références retournées par des méthodes de la même façon???

    Merci de vos réponses!!!
    Etant donné que ton premier message n'est pas très clair, j'aiu peur de répondre à coté. Néanmoins, renvoyer une référence vers un attribut ne pose aucun problème "technique "tant que l'objet référéncé est valide;
    Après, il faut se poser la question de l'utilité renvoyer une référence non constante sur un objet et de la garder. Dans certains cas, c'est utile (vector) dans d'autres ca peut être problématique. A voir.

    Enfin la gestion de la validité est une autre problématique qui doit s'examiner en fonction de ton code.




    Citation Envoyé par bruno_pages Voir le message

    une référence est un pointeur, la durée d'utilisation d'une référence est donc limité à la durée de vie de l'élément référencé.
    Non, pointeurs et références n'ont pas la même sémantique d'utilisation. Un pointeur peut amener à l'arithmétique des pointeurs en cachant à tableau, peut être réalloué, ... A l'inverse une référence n'est qu'un autre nom pour un objet, elle ne peut donc ni être dissocier ni nulle (sauf trick sur l compilo). Après qu'en interne, une référence utilise un pointeur, possible mais on s'en tape.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Non, pointeurs et références n'ont pas la même sémantique d'utilisation.
    curieuse réaction, car je n'ai jamais dit qu'ils avaient la même sémantique d'utiilsation

    qu'en interne, une référence utilise un pointeur, possible mais on s'en tape.
    et non justement, car on ne peut pas passer outre tout ce que cela implique

    ... a croire que le but de la réponse était juste de polémiquer
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par bruno_pages Voir le message
    curieuse réaction, car je n'ai jamais dit qu'ils avaient la même sémantique d'utiilsation


    et non justement, car on ne peut pas passer outre tout ce que cela implique

    ... a croire que le but de la réponse était juste de polémiquer
    Non, de démontrer la fausseté de ta réponse : "une référence est un pointeur" c'est tout simplement faux car justement ils n'ont pas la même sémantique d'utilisation.
    et non justement, car on ne peut pas passer outre tout ce que cela implique
    On peut s'en passer, il suffit de regarder la norme pour savoir les règles d'utilisation et de validité d'une référence. Le pointeur en dessous, c'est de la cuisine interne.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 79
    Par défaut
    Bonjour,

    ma question ne portait pas tellement sur la nature des références mais sur leur utilisation. Plus précisément, lorsqu'une référence vers un attribut d'instance est renvoyée par une fonction, est ce que le fait que ce soit une référence et non un pointeur qui soit passé est un message "hého, tu peux utiliser cette référence dans le même bloc où tu l'as demandé, mais tu ne dois pas la conserver".

    S'il y a ce message, ça me serait bien utile.

    Ce n'est pas une question de "techniquement, tu peux garder une référence, elle sera valide tant qu'est valide le référencé", mais plutot de "par convention entre codeurs C++, lorsqu'on passe un attribut par référence, c'est qu'il ne faut pas conserver de lien vers cet attribut".

    Par exemple, avec la classe Image, je voudrais pouvoir passer son buffer de pixels à un objet Enregistreur pour qu'il l'enregistre dans un fichier. Je peux donc faire une fonction GetPixels qui sera appelée par Enregistreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Image {
    public:
    char * GetPixels(){return pixels;}
    protected:
    char * pixels;
    }
    Cependant, rien n'empèche Enregistreur de conserver dans un de ses attributs le pointeur donné par GetPixel, pour par exemple enregistrer l'image toutes les 30 milisecondes.

    Cela est embettant si je ne veux pas qu'il le conserve, mais plutot qu'il le redemande à chaque fois qu'il re-enregistre.

    J'ai entendu dire que si on ne veut pas qu'il conserve pixels, il faut renvoyer pixels dans une référence. Car lorsqu'un attribut est renvoyé par une référence, donc ici char * & GetPixels(), le programmeur saurait par expérience qu'il ne faut pas essayer de conserver le référencé. Ainsi, si un programmeur codait Enregistreur et qu'il voyait que Image propose char * & GetPixels() pour accéder aux pixels, il saurait qu'il ne faut pas conserver pixels.

    Est ce que vous voyez les choses de la même façon?
    Est ce que vous avez une autre méthode pour faire passer le message "hého, je te donne un lien vers un de mes attributs, mais tu ne dois pas le conserver"???

Discussions similaires

  1. objet retourné par une méthode
    Par wafiwafi dans le forum Général Java
    Réponses: 4
    Dernier message: 17/08/2011, 23h37
  2. Réponses: 21
    Dernier message: 28/07/2011, 13h35
  3. valeur retournée par une méthode
    Par soujava dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 02/05/2008, 21h20
  4. Type incompatible retourné par une méthode
    Par beegees dans le forum Langage
    Réponses: 4
    Dernier message: 22/04/2007, 19h23
  5. Réponses: 3
    Dernier message: 02/01/2007, 13h53

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