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 :

valeur de retour par reference


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 49
    Points : 25
    Points
    25
    Par défaut valeur de retour par reference
    salut tout le monde
    je suis débutante en c++;je compile sous devc++
    j'ai un problème dans ce programme quand je fais la valeur de retour de la fonction "sym" par reference et je ne sais pas d'pi l'erreur aidez moi s'il vous plais
    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
    30
    31
    32
    33
    34
    35
    36
    37
     
    #include<iostream>
    using namespace std;
    class point
    {
           int x,y;
           public:
                  point(int a=0,int b=0)
                  {
                            x=a;
                            y=b;
                            cout<<"la construction de l'objet "<<x<<" "<<y<<endl;
                  }
                  void affiche()
                  {
                       cout<<"l'objet courant est "<<x<<" "<<y<<endl;
                  } 
                  point& sym()
                  {
                      point res;
                      res.x=-x;
                      res.y=-y;
                      return res;
                  }
                  ~point()
                  {
                         cout<<"la destruction de l'objet "<<x<<" "<<y<<endl;
                  }
    };
    int main()
    {
        point no(9,9),lo;
        lo=no.sym();
        lo.affiche();
        system("PAUSE");
        return 0;
    }
    et merci d'avance

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Tu retournes une reference sur un objet local donc un objet qui n'existe plus à la sortie de ta fonction.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    En fait, la question est que doit faire la fonction sym()

    En regardant ton code, la réponse est : elle retourne un objet symétrique de l'instance de la classe courante.

    donc la fonction est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                  point sym()
                  {
                      point res;
                      res.x=-x;
                      res.y=-y;
                      return res;
                  }
    Il faudrait jouer aussi avec les const qualifier.

    comme sym() ne modifie pas la classe courante, il peut devenir :
    et c'est pareil pour affiche(). Avec les const, le compilateur peut faire plus de controle et t'aider à détecter plus vite les bugs

    PS : j'aime pas l'écriture fonction(), je préfère fonction(void) mais il parait que c'est pareil ...

    NOTA: Cette intervention a dénéré une digression sur l'utilité d'expliciter le type void comme parametre de fonction.

    Vous pourrez suivre cette digression ==>ici<==.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    merci pour votre réponse
    mais je n'ai pas encore bien saisi le problème s'il vous plais Lucien63 vous pouvez me détailler un peu ce que vous avez dit:
    Tu retournes une reference sur un objet local donc un objet qui n'existe plus à la sortie de ta fonction.
    merci ram-0000 pour l'information
    merci encore une fois

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                  point& sym()
                  {
                      point res;  // l'objet est créé ici.
                      res.x=-x;
                      res.y=-y;
                      return res;
                  }   // ici il est détruit.
    Comme ta reference fait reference à l'objet local res de la fonction sym et que cette objet est automatiquement détruit à la sortie de la fonction. la reference fourni en retour, reference un objet qui à été détruit qui par consequent n'existe plus.

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par meryeminfo Voir le message
    merci pour votre réponse
    mais je n'ai pas encore bien saisi le problème s'il vous plais Lucien63 vous pouvez me détailler un peu ce que vous avez dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Tu retournes une reference sur un objet local donc un objet qui n'existe plus à la sortie de ta fonction.
    merci ram-0000 pour l'information
    merci encore une fois
    La référence c'est un alias sur une variable. D'autre part quand tu crées une variable, à la sortie du scope où a été crée la variable alors elle est détruite. Ici la portée c'est la fonction donc tu crées la variable et elle est détruite a la sortie de la dite fonction donc tu peux pas la retourner..

    edit : grillée...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    merci beaucoup
    si je ne fais pas un retour par reference l’objet local res de la fonction sym() est détruit AVANT que la transmission de valeur ait été faite.Ainsi, la libération de place mémoire a lieu trop tôt

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    point a(10, 12);
     
    point p = a.sym();
    l'objet point retourné par la méthode sym() aura une durée de vie suffisante pour permettre l'affectation dans p. En fait, on pourrait dire que l'objet retourné par la fonction sym() est effacé après le ';'

    Au fait, une classe qui s'appelle point, cela doit exister en vrai (donc pas utile de la réinventer) ou alors si c'est pour apprendre/exercice, lui donner un autre nom (MaClassePoint) permettrait d'éviter une collision de nom.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. Passage de valeur par reference
    Par psmpa dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 05/03/2009, 16h22
  2. PrinterSetupDialog.Execute - Valeur de retour par défaut
    Par Lung dans le forum Composants VCL
    Réponses: 10
    Dernier message: 03/04/2008, 07h58
  3. Réponses: 4
    Dernier message: 17/01/2008, 15h55
  4. Valeur de retour après recherche par itérateur
    Par Mindiell dans le forum SL & STL
    Réponses: 4
    Dernier message: 13/09/2007, 19h33
  5. Réponses: 9
    Dernier message: 26/07/2007, 16h35

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