Probleme de passage d'argument

dr971 Messages postés 27 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
    0
  2. dr971 Messages postés 27 Statut Membre
     
    merci de votre aide
    Mais j'avais oublié de préciser ke la classe Adérive de la classe B. ca change un truc?
    0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
    0
  4. dr971 Messages postés 27 Statut Membre
     
    et comment je peux faire alors stp??
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
    0