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
A voir également:
- Probleme de passage d'argument
- Passage qwerty azerty - Guide
- Passage windows 10 à 11 gratuit - Guide
- Test passage windows 11 - Guide
- Choisir passage sonnerie samsung - Guide
- Passage windows 7 à 10 - Accueil - Mise à jour
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 :
.. 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 :
Moi je pense que la solution intelligente c'est d'écrire
et tu peux même garder tes accesseurs tels quels.
Bonne chance
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'écrire
void 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?
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.
Bonne chance
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.
Ce qui donne :
Bonne chance
#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