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
Configuration: Windows XP
Internet Explorer 6.0

5 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    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'é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
    1. merci de votre aide
      Mais j'avais oublié de préciser ke la classe Adérive de la classe B. ca change un truc?
      1. Modérateur
        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
        1. Modérateur
          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