2017-05-20 5 views
1

setwidth() est une fonction de membre de la classe Box et il est également fonction d'ami de classe Sbox qui établit les valeurs des membres width des deux classes.Définition d'une valeur par une fonction ami qui est une fonction de membre d'une autre classe

La valeur de width de la classe Sbox ne s'affiche pas correctement.

#include<iostream> 

using namespace std; 

class Sbox; 

class Box{ 
    private: 
     double width; 
    public: 
     friend void printwidth(Box box); 
     void setwidth(Sbox sbox, double wid); 
}; 

class Sbox { 
    private: 
     double width; 
    public: 
     friend void Box::setwidth(Sbox sbox, double wid); 
     void printwidth() { 
      cout << "the width of small box: " << width; //this value is coming wrong 
     } 
}; 

void Box::setwidth(Sbox sbox, double wid) { 
    width = wid; 
    sbox.width = wid; 
} 

void printwidth(Box box) { 
    cout << "width of the box: " << box.width << endl; 
} 

int main() { 
    Box box; 
    Sbox sbox; 
    box.setwidth(sbox, 10.77); 
    printwidth(box); 
    sbox.printwidth(); 
    return 0; 
} 

Répondre

1

Vous devez transmettre la Sbox par référence. Ajoutez l'esperluette à ces trois lignes.

void setwidth(Sbox& sbox,double wid);

friend void Box::setwidth(Sbox& sbox,double wid);

void Box::setwidth(Sbox& sbox,double wid)

Vous avez été de passer votre sbox dans la valeur, ce qui signifie qu'une copie est faite pour utilisation à l'intérieur setwidth. Votre code modifie ensuite la largeur sur cette copie de sbox, mais la copie est ensuite détruite à la fin de setwidth et l'original sbox en dehors de la fonction reste inchangé.

Ajout du & signifie que l'argument Sbox est passé par référence, ce qui signifie que la copie ne se fait jamais, de sorte que le sbox intérieur setwidth est le même objet que celui de l'extérieur.

Bonne lecture ici: How to pass objects to functions in C++?

+1

il a travaillé, Merci – falco97