2好友构造函数的操作
Operation with 2 friends constructor
我创建了两个类,每个类都有一个构造函数。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++默认为最严格的private
。private
成员只能被对象和定义为友元的对象看到。
所以运动粘度没有动态粘度即使有,它也看不到动态粘度
<标题>建议解决方案将运动学粘度的定义更改为
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。
标题>标题>- 避免通过操作从私有构造函数间接实例化
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 复制构造函数、按值传递和按值返回、链式操作、编译器
- 更改操作的构造函数顺序
- 如果默认构造函数不执行任何操作,则目的是什么
- 为什么为单个赋值操作调用复制构造函数和重载赋值运算符
- C 内存模型是否提供了有关构造函数操作的保证
- 如何编写两个初始化操作(一个作为默认初始化,另一个作为用户输入)?两者都是类的构造函数C++
- 不执行任何操作的结构的构造函数
- std::vector 的复制构造函数是如何操作的?
- 在语法构造函数中评估的语义操作(或不评估?
- 构造函数中对整数数组的memcpy()操作在C++中给出了意外的输出
- 当我修改复制构造函数以执行一些奇怪的操作,然后按值将对象(该类)传递给函数时会发生什么
- 语句调用构造函数,但对构造函数不做任何操作——为什么它不能编译
- 构造函数初始化列表vs昂贵操作
- 删除复制构造函数/赋值会破坏标准库操作吗?
- 赋值操作和对象传递期间的构造函数调用
- 2好友构造函数的操作
- 标准函数和操作在类构造函数中不起作用
- 对内存分配和构造函数的调用是否可以与执行"new"表达式所需的其他操作交错?