2010-06-15 19 views
1

J'ai une classe avec un vecteur privé de doubles. Pour accéder ou modifier ces valeurs, tout d'abord je des méthodes telles quepush_back vecteurs privés avec 2 méthodes, on ne travaille pas

void classA::pushVector(double i) 
{ 
this->vector.push_back(i); 
} 
double classA::getVector(int i) 
{ 
return vector[i]; 
} 

Cela a fonctionné pendant un certain temps jusqu'à ce que je trouve que je dois surcharger beaucoup d'opérateurs pour ce que je avais besoin, j'ai donc essayé de le changer pour obtenir et définir le vecteur directement au lieu des valeurs, à savoir

void classA::setVector(vector<double> vector) 
{ 
this->vector = vector; 
} 
vector<double> classA::getVector() 
{ 
return vector; 
} 

maintenant, dire qu'il ya un ClassB, qui a un élément de CLASSA privé, qui a également méthodes get et set pour lire et écrire. Le problème était quand j'ai essayé de repousser une valeur au vecteur final dans la classe A.

void classB::setFirstValue(double first) 
{ 
this->getClassA().getVector().push_back(first); 
} 

Cela ne fait absolument rien au vecteur. Il reste inchangé et je n'arrive pas à comprendre pourquoi ... Des idées?

Répondre

3

Vous renvoyez le vecteur par valeur dans votre getVector(). Cela signifie que dans votre appel "this-> getClassA(). GetVector(). Push_back (first);", vous copiez le vecteur, puis vous appuyez sur l'élément sur la copie. La copie est ensuite immédiatement rejetée.

Afin de le faire fonctionner comme vous le souhaitez, vous devez renvoyer le vecteur par référence. Votre méthode ressemblera:

"vecteur & CLASSA :: getVector()"

+2

Bien que ce soit la raison du comportement de l'OP, il ne faut pas passer des références non-const aux données internes. jmclem, vous devriez envisager à quel point l'accès aux données que vous stockez dans vos utilisateurs vectoriels de la classe A a vraiment besoin et implémenter les fonctions nécessaires en tant que membres de la classe A directement. – haffax

+0

a parfaitement fonctionné, merci. Comme haffax a dit, les consts ont dû être enlevés. Je verrai quoi faire à ce sujet. Peut-être que les éléments n'ont pas besoin d'être privés, mais j'essayais de former une «bonne» structure. Peut-être que ce n'est pas la meilleure façon de le faire. Merci pour votre aide! – jmclem

2

Dans cette méthode:

void classA::setVector(vector<double> vector) 
{ 
this->vector = vector; 
} 

vous passez une copie du vecteur. Pour passer le vecteur réel, vous avez besoin d'une référence:

void classA::setVector(vector<double> & vector) 
{ 
this->vector = &vector; 
} 

et la variable vecteur dans votre classe devra être un pointeur.

Tout cela me semble plutôt indésirable - je repense à ce que fait votre classe. Il est beaucoup plus logique pour la classe de gérer le vecteur que de maintenir un pointeur vers l'extérieur de la classe. et si vous avez besoin de ré-implémenter toutes les méthodes de classe, peut-être n'avez-vous pas du tout besoin de classe, mais juste un vecteur.

+0

C'était hypothétique, la classe avec laquelle je travaille a plus de 15 éléments, certains d'entre eux étant des vecteurs et ce n'était qu'un cas particulier. J'ai fini par utiliser des références comme dans votre réponse et celle ci-dessus, mais il n'est pas nécessaire d'utiliser des pointeurs. Le & pointe déjà vers l'adresse mémoire d'une variable en dehors de la portée de la fonction afin de l'affecter directement au lieu de créer une copie. Pour utiliser des pointeurs sur le même effet, vous devez créer un pointeur vers la variable en dehors de la fonction et utiliser ce pointeur comme argument de fonction (sans & s, naturellement). Merci pour votre réponse! – jmclem

+0

@jmclem À peu près tout ce que vous dites dans ce commentaire est faux. –

+0

C'est tout à fait possible, puisque j'ai seulement commencé avec le C++ (et la programmation en général) il y a quelque temps. Cela a fonctionné sans pointeurs, cependant. – jmclem