Probleme de passage d'argument
Bonjour , j'ai un petit prob (plutot un gros)
En fait j'ai une class A et une class B
classA
{
public :
void setResistance(int); //mutateur
int getResistance(); //accesseur
private:
int m_resistance;
};
classB
{
public :
void petitprog(int res)
{
res=res-2;
}
}
Dans mon main j'ai :
A elementa;
B elementb;
et je veux faire
elementb.petitprog(elementa.getResistance( ));
Mon probleme est ke je voudrais que la valeur de m_resistance change mais ce n'est pas le cas.
Pouvez vous m'aider?? merci d'avance
En fait j'ai une class A et une class B
classA
{
public :
void setResistance(int); //mutateur
int getResistance(); //accesseur
private:
int m_resistance;
};
classB
{
public :
void petitprog(int res)
{
res=res-2;
}
}
Dans mon main j'ai :
A elementa;
B elementb;
et je veux faire
elementb.petitprog(elementa.getResistance( ));
Mon probleme est ke je voudrais que la valeur de m_resistance change mais ce n'est pas le cas.
Pouvez vous m'aider?? merci d'avance
Configuration: Windows XP Internet Explorer 6.0
5 réponses
-
Ben il faut soit que petit prog manipule un pointeur (*) ou une référence (&) sur le resistance que tu veux modifier (celui de l'objet a), car sinon tu manipules une recopie :
int & getResitance(){ return m_resistance; } void petitprog(int & res){ res -= 2; }
.. mais ça c'est pas terrible parce qu'un accesseur sert normalement à empêcher que l'objet accédé ne soit pas modifiable (sinon autant faire une structure). En gros ton accesseur devrait s'écrire en toute rigueur :inline const int & getResistance() const{ return m_resistance; }
Moi je pense que la solution intelligente c'est d'écrirevoid petitprog(A & a){ int res = a.getResitance(); a.setResistance(res - 2); }
et tu peux même garder tes accesseurs tels quels.
Bonne chance -
merci de votre aide
Mais j'avais oublié de préciser ke la classe Adérive de la classe B. ca change un truc? -
Ah oui ca change que res est directement accessible par la classe fille si res est public ou protected et que l'héritage est public.
class B : public A { ... }
Bonne chance -
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
En fait dans ta classe fille tu vas pouvoir directement accéder au champ m_resistance, mais seulement si l'héritage est public et si ce champ est protected ou public.
#include <iostream> class A{ protected: int m_resistance; public: A(int res = 0) : m_resistance(res){} inline int get_resistance() const{ return m_resistance; } }; class B : public A { public: B(int res):A(res){} void petit_prog(){ m_resistance -= 2; } }; int main(){ B b(69); std::cout << "b.res = " << b.get_resistance() << std::endl; b.petit_prog(); std::cout << "b.res = " << b.get_resistance() << std::endl; return 0; }
Ce qui donne :b.res = 69 b.res = 67
Bonne chance