0

在遇到了很多关于双精度类型变量的问题,比如测试相等和除以零等问题之后,我想到了创建一个类来处理双精度值,并尝试将我们经常使用的内在双精度值与新类无缝切换。但它并不完全适合。这是我的课:

class HDouble
{
  //private:
public:
  double dValue;
  static const double dEpsilon;


  HDouble()
  {
    dValue = 0.0;
  }

  HDouble(double OtherValue)
  {
    if (IsNaN(OtherValue))
    {
      assert(0);
    }
    dValue = OtherValue;
  }

  const HDouble& operator=(const HDouble& OtherValue)
  {
    if (this == &OtherValue)      // Same object?
      return *this;

    if (IsNaN(OtherValue.dValue))
    {
      assert(0);
    }
    dValue = OtherValue.dValue;
    return *this;
  }

  const HDouble& operator=(const double& OtherValue)
  {
    dValue = OtherValue;
    return *this;
  }
  bool operator==(const HDouble& OtherValue)
  {
    return (abs(dValue - OtherValue.dValue) < dEpsilon);
  }

  //////////////////////////////////////////////////////////////////////////
  const HDouble& operator++()
  {
    dValue++;
    return *this;
  }
  const HDouble& operator++(int dummy)
  {
    dValue++;
    return *this;
  }
  const HDouble& operator--()
  {
    dValue--;
    return *this;
  }
  const HDouble& operator--(int dummy)
  {
    dValue--;
    return *this;
  }


//////////////////////////////////////////////////////////////////////////
  HDouble operator*(const HDouble& OtherValue)
  {
    HDouble Result = *this;
    Result *= OtherValue;
    return Result;
  }
  HDouble operator*(const double& OtherValue)
  {
    HDouble Result = *this;
    Result *= OtherValue;
    return Result;
  }

  HDouble operator/(const HDouble& OtherValue)
  {
    HDouble Result = *this;
    Result /= OtherValue;
    return Result;
  }
  HDouble operator/(const double& OtherValue)
  {
    HDouble Result = *this;
    Result /= OtherValue;
    return Result;
  }

  HDouble operator+(const HDouble& OtherValue)
  {
    HDouble Result = *this;
    Result += OtherValue;
    return Result;
  }
  HDouble operator+(const double& OtherValue)
  {
    HDouble Result = *this;
    Result += OtherValue;
    return Result;
  }

  HDouble operator-(const HDouble& OtherValue)
  {
    HDouble Result = *this;
    Result -= OtherValue;
    return Result;
  }
  HDouble operator-(const double& OtherValue)
  {
    HDouble Result = *this;
    Result -= OtherValue;
    return Result;
  }

  //////////////////////////////////////////////////////////////////////////
  HDouble& operator*=(const double& OtherValue)
  {
    dValue *= OtherValue;
    return *this;
  }
  HDouble& operator*=(const HDouble& OtherValue)
  {
    dValue *= OtherValue.dValue;
    return *this;
  }

  HDouble& operator+=(const HDouble& OtherValue)
  {
    dValue += OtherValue.dValue;
    return *this;
  }
  HDouble& operator+=(const double& OtherValue)
  {
    dValue += OtherValue;
    return *this;
  }


  HDouble& operator-=(const double& OtherValue)
  {
    dValue -= OtherValue;
    return *this;
  }
  HDouble& operator-=(const HDouble& OtherValue)
  {
    dValue -= OtherValue.dValue;
    return *this;
  }

  HDouble& operator/=(const double& OtherValue)
  {
    dValue /= OtherValue;
    return *this;
  }
  HDouble& operator/=(const HDouble& OtherValue)
  {
    dValue /= OtherValue.dValue;
    return *this;
  }
  //////////////////////////////////////////////////////////////////////////


  inline bool IsNaN(double d) 
  {
    if (!(d >= DBL_MIN && d <= DBL_MAX))
    {
      return true;
    }
    else
      return false;
  }
};

一个问题就像一个已经存在的函数调用 cos() 函数,它需要一个双精度值。有没有办法让我的类对象在需要时衰减到内在的双倍?谢谢。

ps 我的课程必须与现有代码无缝匹配。不能改变这一点。我所能做的就是用HDouble搜索并替换double。

4

3 回答 3

0

您需要向您的类添加一个复制构造函数和一个转换运算符,并且您还应该将该类的数据成员移动到private

class HDouble 
{ 
private: 
  double dValue; 

public: 
  static const double dEpsilon; 

  HDouble() 
  { 
    dValue = 0.0; 
  } 

  HDouble(double OtherValue) 
  { 
    if (IsNaN(OtherValue)) 
    { 
      assert(0); 
    } 
    dValue = OtherValue; 
  } 

  HDouble(const HDouble &src) 
  { 
    dValue = src.dValue; 
  } 

  ...

  operator double() const
  {
    return dValue;
  }

  ...
}; 
于 2012-09-21T21:18:25.603 回答
0

是的,将转换运算符添加到您的类:添加operator double() { return dValue; }到您的类。这样HDouble,当您将其传递给cos.

此外,您已将所有运算符实现为成员函数。我建议阅读有关运算符重载的内容。

于 2012-09-21T21:17:04.193 回答
0

您可以添加一个方法来返回double

double value()
{
    return dValue;
}
于 2012-09-21T21:17:48.467 回答