2009-10-15 8 views
0
#include "iostream" 
#include "vector" 
using namespace std; 

const vector<int>& Getv() 
{ 
vector<int> w(10); 
w[0]=10; 
cout<<w.size()<<endl; 
return w; 
} 
//Now when I write in main: 
vector<int>v = Getv();//Throws exception 
//and the below rows has no effect 
vector<int>v; 
v=Getv()//w does not change 

S'il vous plaît quel est le problème?
Hani Almousli ...Problème d'affectation de vecteur

Répondre

9

Vous renvoyez une référence à une variable locale. Lorsque vous quittez la fonction, elle est détruite.

Vous devez retourner une copie:

vector<int> Getv() 
{ 
    vector<int> w(10); 
    w[0]=10; 
    cout<<w.size()<<endl; 
    return w; 
} 

Ou vous pouvez faire w statique:

const vector<int>& Getv() 
{ 
    static vector<int> w(10); 
    w[0]=10; 
    cout<<w.size()<<endl; 
    return w; 
} 

Aussi, vous devez utiliser <> sur votre comprend, car ils font partie de la bibliothèque standard.

+0

ou de renvoyer un pointeur. – Tom

+0

Merci beaucoup, mais pourquoi je dois écrire statique ici et je ne dois pas l'écrire si je retourne un étudiant et par exemple.Je veux dire supposer que je suis de retour étudiant et au lieu de vecteur ? – Hani

+0

Les variables statiques ne sont pas stockées dans la pile, elles ne sont donc pas détruites lorsque la fonction se termine. Ensuite, il est légal de renvoyer une référence. Si vous renvoyez un étudiant et que votre objet étudiant n'est pas statique, c'est un comportement non défini. – Tom

1

Il semble que vous confondiez le paramètre de retour et l'argument d'entrée. Il est sûr de passer l'argument par référence constante:

void fun(const vector<int>& arg1) 
{ 
    //something 
} 

Dans cet exemple, vous passez référence, donc constructeur de copie ne soit pas invoquée.

Mais il est dangereux de renvoyer la valeur de référence (const ou const const) de la fonction. Voir la réponse de Bruce ci-dessus. vous pouvez également prolonger la durée de référence:

const vector<int>& Getv() 
{ 
    vector<int> w(10); 
    w[0]=10; 
    cout<<w.size()<<endl; 
    return w; 
} 

const vector<int>& v = Getv(); //now all ok 

Mais je ne recommande pas de cette façon. Cela peut être la source de futurs bugs. Le meilleur moyen est de renvoyer la valeur du vecteur.

vector<int> Getv() 
{ 
    vector<int> w(10); 
    w[0]=10; 
    cout<<w.size()<<endl; 
    return w; 
} 

vector<int>v = Getv(); 

Comme il n'y a que 1 déclaration de retour, vous pouvez expliquer RVO et constructeur de copie ne sera pas invoquer aussi. c'est rapide et sûr.

Questions connexes