2好友构造函数的操作

Operation with 2 friends constructor

本文关键字:操作 构造函数 好友      更新时间:2023-10-16

我创建了两个类,每个类都有一个构造函数。Type遵循一个新的类,构造函数是以前类的友函数。

#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;
    i >> 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;
    i >> 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 is where IDE gives me the error
      return kinematicViscocity;
}

IDE在函数中显示错误:error: 'dynamicViscocity' undeclares (first use this function)

我在一些网站上检查了一下,当你做操作时,我发现没有必要通过参考构建器传递值。

这里有几个问题。

dynamicViscocity是classdynamicviscocity的成员。运动学粘不是任何类的成员,但我怀疑它是打算成为clsAtmosfericConditions的成员。无论如何,kinematicViscocity不是clsDynamicViscocity的成员,所以为了对dynamicViscocity进行操作,它需要一个clsDynamicViscocity类型的对象来提供dynamicViscocity。

其次,dynamicviscosity的可见性(public, private, protected)没有指定,因此c++默认为最严格的privateprivate成员只能被对象和定义为友元的对象看到。

所以运动粘度没有动态粘度即使有,它也看不到动态粘度

<标题>建议解决方案

将运动学粘度的定义更改为

float clsAtmosfericConditions::kinematicViscocity(const clsDynamicViscocity & vis,
                                                  const clsDensity & den)
{    
    float kinematicViscocity;
    kinematicViscocity = vis.getDynamicViscocity() / den.getDensity(); 
    return kinematicViscocity;
}

为kinematicviscosity提供一个clsdynamicviscosity,并添加一个getter函数

double getDynamicViscocity() const
{
    return dynamicViscocity;
}
clsDynamicViscocity

从clsDensity访问density也需要做同样的事情。

<标题>编辑

等一下…

终于明白你到底想干什么了:

friend clsDynamicViscocity::clsDynamicViscocity(double viscocidadDinamica);
friend clsDensity::clsDensity(float densidad);

一个类声明他们将允许谁看到和使用他们的隐藏内部。类不能声明谁的隐藏内部是它们可以看到的。这样想,Bob可以和Alice做朋友并告诉她他的秘密,但是Bob不能强迫Alice成为他的朋友并告诉他她的秘密。爱丽丝必须自己做决定。

上面的意思是这两个方法可以违反封装并看到clsAtmosfericConditions的隐藏内部。然而,clsAtmosfericConditions不能看到clsdynamicviscosity或clsDensity的内部。

clsdynamicviscoity和clsDensity必须通过friend class clsAtmosfericConditions来允许clsAtmosfericConditions看到它们,而不是相反。

clsDensity()
{
    friend class clsAtmosfericConditions;
    ...
}

clsDynamicViscocity()
{
    friend class clsAtmosfericConditions;
    ...
}

现在改变kinematicviscosity看起来像这样:

float clsAtmosfericConditions::kinematicViscocity(const clsDynamicViscocity & vis,
                                                  const clsDensity & den)
{    
    float kinematicViscocity;
    kinematicViscocity = vis.dynamicViscocity / den.density; 
    return kinematicViscocity;
}

你是金色的。

使用getter的原始解决方案是一个更好的解决方案,因为它不需要任何友元,并且耦合度要低得多。只要getter函数原型保持不变,并且clsAtmosfericConditions对clsdynamicviscosity和clsDensity的访问权限不超过获取数据所需的权限,clsAtmosfericConditions就可以从根本上改变clsdynamicviscosity和clsDensity。