c++ - Operation with 2 friends constructor -


i created 2 classes , constructor in each. type followed new class , constructors friends functions of classes before.

#include <iostream>  using namespace std;  class clsatmosfericconditions;  class clsdensity{     float density; public:     clsdensity(){}     clsdensity(float densidad){         density = densidad;     }     friend istream& operator >>(istream &i, clsdensity &e);     friend ostream& operator <<(ostream &o, const clsdensity &s); };  istream& operator >>(istream &i, clsdensity &e){     char sign;     >> e.density >> sign >> sign >> sign >> sign >> sign >> sign;     return i; }  ostream& operator <<(ostream &o, const clsdensity &s){     o << s.density << " kg/m^3";     return o; }  class clsdynamicviscocity{     double dynamicviscocity; public:     clsdynamicviscocity(){}     clsdynamicviscocity(double viscocidaddinamica){         dynamicviscocity = viscocidaddinamica;     }     friend istream& operator >>(istream &i, clsdynamicviscocity &e);     friend ostream& operator <<(ostream &o, const clsdynamicviscocity &s); };  istream& operator >>(istream &i, clsdynamicviscocity &e){     char sign;     >> e.dynamicviscocity >> sign >> sign >> sign >> sign >> sign;     return i; }  ostream& operator <<(ostream &o, const clsdynamicviscocity &s){     o << s.dynamicviscocity << " n/m^2";     return o; }  class clsatmosfericconditions{       friend clsdynamicviscocity::clsdynamicviscocity(double viscocidaddinamica);       friend clsdensity::clsdensity(float densidad); public:        float kinematicviscocity(); };  float kinematicviscocity(){       float kinematicviscocity;       kinematicviscocity = dynamicviscocity/density; //here ide gives me error       return kinematicviscocity; } 

the ide displays error in function: error: 'dynamicviscocity' undeclares (first use function)

i checked on websites , see no need pass values ​​by reference builder when operation.

couple of problems here.

dynamicviscocity member of class clsdynamicviscocity. kinematicviscocity not member of class, suspect is intended member of clsatmosfericconditions. regardless, kinematicviscocity not member of clsdynamicviscocity, in order operate on dynamicviscocity, needs object of type clsdynamicviscocity provide dynamicviscocity.

second, visibility (public, private, protected) of dynamicviscocity not specified, c++ defaults restrictive, private. private member cannot seen except object , object has defined friends.

so kinematicviscocity has no dynamicviscocity , if did, cannot see dynamicviscocity.

suggested solution

change definition of kinematicviscocity

float clsatmosfericconditions::kinematicviscocity(const clsdynamicviscocity & vis,                                                   const clsdensity & den) {         float kinematicviscocity;     kinematicviscocity = vis.getdynamicviscocity() / den.getdensity();      return kinematicviscocity; } 

to provide clsdynamicviscocity kinematicviscocity , add getter function

double getdynamicviscocity() const {     return dynamicviscocity; } 

to clsdynamicviscocity.

the same needs done access density clsdensity.

edit

waaaait second...

finally figured out trying here:

friend clsdynamicviscocity::clsdynamicviscocity(double viscocidaddinamica); friend clsdensity::clsdensity(float densidad); 

a class declares allow see , use their hidden internals. class cannot declare who's hidden internals they can see. think of way, bob can friends alice , show secrets, bob cannot force alice friend , show him secrets. alice has make decision herself.

what above means 2 methods can can violate encapsulation , see hidden internals of clsatmosfericconditions. clsatmosfericconditions cannot see internals of clsdynamicviscocity or clsdensity.

clsdynamicviscocity , clsdensity have friend class clsatmosfericconditions allow clsatmosfericconditions see them, not other way around.

so

clsdensity() {     friend class clsatmosfericconditions;     ... } 

and

clsdynamicviscocity() {     friend class clsatmosfericconditions;     ... } 

now change kinematicviscocity this:

float clsatmosfericconditions::kinematicviscocity(const clsdynamicviscocity & vis,                                                   const clsdensity & den) {         float kinematicviscocity;     kinematicviscocity = vis.dynamicviscocity / den.density;      return kinematicviscocity; } 

and golden.

the original solution getters better solution requires no friends whatsoever , less tightly coupled. guts of clsdynamicviscocity , clsdensity can radically changed without breaking clsatmosfericconditions long getter function prototypes remain same , clsatmosfericconditions granted no more access clsdynamicviscocity , clsdensity required data.


Comments