2009-08-20 9 views
14

J'essaie simplement de surcharger un opérateur + et je reçois ce compilateur avertissementC++ avertissement du compilateur - retour variable locale

reference to local variable 'tmp' returned 

Voici le code de la surcharge

const Int& Int::operator+(const Int& p) const 
{ 
    Int tmp = value + p.value; 
    return tmp; 
} 

ici est la classe

class Int{ 
    int value; 
public: 
    Int() {} // default constructor 
    Int(int v) : value(v) {} 
    Int& operator=(const Int&); 
    const Int& operator+(const Int&) const; 
}; 

Répondre

15

Vous ne pouvez pas renvoyer une référence à une variable locale. Dans la fonction operator+(), vous créez une variable locale appelée tmp. Il sera détruit dès que la fonction se termine. Vous ne pouvez pas renvoyer une référence à cette variable, car elle n'existe plus lorsque la fonction appelante obtient la valeur de retour.

Changer votre définition de la fonction à:

const Int operator+(const Int&) const; 

Il construirait sans avertissement préalable et fonctionne bien aussi.

7

Ce que vous essayez de faire est de renvoyer une référence à un emplacement de mémoire qui sera invalide au moment où vous le retournez.

La variable tmp disparaît lorsqu'elle est hors de portée (c'est-à-dire lorsque l'opérateur + a terminé). Comme votre type de retour est Int &, la valeur de tmp n'est pas retournée à "return tmp" mais une référence à tmp. Ce n'est pas correct parce que tmp n'existera plus une fois la méthode terminée !!

Solution: Ne pas revenir comme référence, mais comme Int

0

tmp a une classe de stockage de auto et disparaîtra quand nous sortons. La réponse est de spécifier statique.

static Int tmp = value + p.value; 

Le stockage attribué à tmp restera réservée pendant toute la durée du programme.

Questions connexes