代码之家  ›  专栏  ›  技术社区  ›  Jacob Relkin

C++中运算符重载的对数实现

  •  2
  • Jacob Relkin  · 技术社区  · 16 年前

    我的第一个目标是如何实现 changeBase 方法,我一直很难把我的头围绕着它。

    我的第二个目标是能够执行左操作数为 double 右操作数是对数对象。

    下面是我的日志类的一个片段:

    // coefficient: double
    // base: unsigned int
    // result: double
    class _log {
    
     double coefficient, result;
     unsigned int base;
    
    public:
    
     _log() {
      base = 10;
      coefficient = 0.0;
      result = 0.0;
     }
     _log operator+ ( const double b ) const;
     _log operator* ( const double b ) const;
     _log operator- ( const double b ) const;
     _log operator/ ( const double b ) const;
     _log operator<< ( const _log &b );
    
     double getValue() const;
    
     bool changeBase( unsigned int base );
    };
    

    你们太棒了,谢谢你们抽出时间。

    3 回复  |  直到 16 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    一些事情

    1. 在全班同学面前使用∗是一个非常糟糕的主意(tm)。根据c++标准:

    某些名称和函数签名集始终保留给 实施:

    • 每个名称都包含一个双下划线(\uuu)或以 后跟大写字母的下划线 信函(2.11)保留给
    • 在中用作名称的实现 165

    165)命名空间::std(17.4.3.1)中也保留了此类名称。

    1. 我猜您使用了\u log而不是log,因为在cmath中与log()冲突。出于这个原因,在标准名称空间中保留自己的类是一个非常糟糕的主意。也许下一个版本的标准将提供一个对数类? namespace somename {} 并使用 somename::Logarithm()

    2. log operator+ ( const double b ) const;

      把它改成

      friend log operator+(const double d, const log& l);
      

      并在命名空间范围中定义函数。

    3. 这是改变基本公式的数学公式

      Change of base formula

    4. 数学中的系数是指被对数相乘的部分。所以如果你有

      A是系数,B是基,Y是结果(或其他名称)

        2
  •  5
  •   James McNellis    16 年前

    我的第二个目标是能够执行左操作数是double,右操作数是对数对象的运算。

    要做到这一点,您需要在名称空间范围中将操作符声明为非成员函数(即,不在 _log

    _log operator+(const double a, const _log& b);
    

    如果您需要访问 ,您可以在的定义中声明它为朋友 _日志

    friend _log operator+(const double a, const _log& b);
    

    请注意,以下划线开头的名称(例如。, )保留给全局命名空间中的实现;如果下划线后跟大写字母或另一个下划线,则它将被保留在所有位置。最好选择一个不同的类名。

        3
  •  1
  •   Potatoswatter    16 年前

    一些想法:

    1. 不要在名字前面加下划线。这样的标识符在C和C++中是放射性的。
    2. 在使用浮点运算之前,定义对数之间的运算。
    3. 把#2和詹姆斯的建议结合起来:

      friend logarithm operator+( const logarithm &l, const logarithm &r );
      
    4. 定义转换构造函数以生成 logarithm 从浮点数:

      logarithm::logarithm( double f );
      

      double 在任何一种情况下 1.0 + my_log my_log + 1.0 .

    5. natural logarithms base .
    6. 根据函数定义基转换:

      double alternate_base( double base ) const;
      

      基本转换就是简单地划分 用备用底座的自然原木。最方便的方法可能是在一个单独的函数中同时返回整数和小数部分 双重的