使用 类 操作

Operation with classes

我正在尝试获得具有两个不同 类 属性的结果。

代码如下:

#include <iostream>

using namespace std;

/*Se hizo el uso de archvios tipo "header" para hacer el codigo mas entendible, tambien en este archivo .h
 se omitio el uso de su respectivo .cpp ya que al compilar se generaba el error de "Redefinir cada una de 
 las clases" esto se presentaba ya que el .h que se incluia en el .cpp era el mismo codigo y hacia una 
 compilacion doble, la solucion fue copiar ese codigo y pegarlo en el .h eliminado asi el .cpp y el problema.*/

/*Se generan 5 clases ya que de esta forma la implementacion de las sobrecargas se hace de una forma mas sencilla*/

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{
    clsAtmosfericConditions(){}

    float kinematicViscocity(class clsDensity, class clsDynamicViscocity){
        float kinematicViscocity;
        kinematicViscocity = clsDensity::clsDensity(float)/clsDynamicViscocity::clsDynamicViscocity(double);
        return kinematicViscocity;
    }
};

我想得到密度和动力粘度的运动粘度比,但我对这条线有疑问:

kinematicViscocity = clsDensity::clsDensity(float)/clsDynamicViscocity::clsDynamicViscocity(double);

Xcode 显示此消息:"Expected '(' for función-style cast or tape construction" 在我定义 float 和 double 时。

我认为问题出在我通过引用传递给 clsDensity 和 clsDynamicViscocity 等方法时。

运行 它通过 gcc。对于您声明的行,它抱怨:

stuff.cpp: In member function ‘float     clsAtmosfericConditions::kinematicViscocity(clsDensity, clsDynamicViscocity)’:
stuff.cpp:62: error: expected primary-expression before ‘(’ token
stuff.cpp:62: error: expected primary-expression before ‘float’
stuff.cpp:62: error: expected primary-expression before ‘(’ token
stuff.cpp:62: error: expected primary-expression before ‘double’

这很有道理。这些函数(恰好是构造函数)分别采用 floatdouble。所以你需要传递它们 floatdouble objects。当你写 float 时,它是一个类型,而不是一个对象(double 也是如此),你不能用它调用函数。


将违规行更改为

 kinematicViscocity = clsDensity::clsDensity(0)/clsDynamicViscocity::clsDynamicViscocity(0);

(这不一定是你想要的,但我猜不到),将投诉更改为

 stuff.cpp: In member function ‘float clsAtmosfericConditions::kinematicViscocity(clsDensity, clsDynamicViscocity)’:
stuff.cpp:62: error: no match for ‘operator/’ in ‘clsDensity(0.0f) / clsDynamicViscocity(0.0)’

这又是有道理的——这构造了两个对象,operator/ 不支持它们的组合。如果您想为类型重载此运算符,请参阅 this tutorial or this one.

您需要向 clsDensityclsDynamicViscocity 添加 public 访问器,以便其他代码可以访问其私有成员的值。

class clsDensity
{
     float density;
 public:
       // other stuff you have

      float GetDensity() const {return density;};
      void SetDensity(double d) {density = d;};
};

并且,类似地,clsDynamicViscocity

然后将成员函数 clsAtmosfericConditions::kinematicViscosity() 更改为类似(如果它在 class 定义内)

float kinematicViscocity(const clsDensity &d, const clsDynamicViscocity &v)
{
    float kinematicViscocity_value;
    kinematicViscocity_value = d.GetDensity()/v.GetViscocity();
    return kinematicViscocity_value;
}

以上代码与您的代码之间的所有差异都是相关的。

  1. kinematicViscosity 无法直接访问 private 的成员 其他 classes(clsDensityclsDynamicViscosity)。那些 classes 需要提供 public 访问器,就像我在这里所做的那样,或者 (除非在特定情况下不可取 - 这不是 这里的例子)将 clsDensityclsDynamicViscosity 声明为 朋友们)。
  2. 您不能使用构造函数的名称来访问私有成员 的 class,就像您尝试过的一样。
  3. 成员函数通常与 class 它们的名称不同 在。非静态成员需要提供一个实例 class(即对象)。
  4. clsDensity::clsDensity(float)是构造函数的声明 对于 clsDensity()。它没有提供一些神奇的手段—— 隐含在您对它的使用中 - 获得密度值。
  5. 具有与函数同名的变量往往会使编译器感到困惑。

如果以上几点对你来说没有意义,那意味着你需要花更多的时间阅读基础教科书来理解,而不是仅仅依靠猜测和黑客代码。我描述的东西是C++的基础和基础,并且在C++的基础文本中描述,但是你的代码和这个问题都表明你没有理解。