2

我在用 C++ 中的运算符重载实现对数类时遇到了一些问题。

我的第一个目标是如何实现该changeBase方法,我一直很难理解它。

我试图理解改变对数底数的数学原理,但我没能做到。有人可以向我解释一下吗?

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

这是我的日志类的片段:

// 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 );
};

你们太棒了,谢谢你们的时间。

4

3 回答 3

5

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

为此,您需要将运算符声明为命名空间范围内的非成员函数(即,不在 的定义中_log),例如,

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

如果您需要访问 的私有成员_log,您可以在 的定义中将其声明为友元_log

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

请注意,以下划线开头的名称(例如,_log)保留给全局命名空间中的实现;如果下划线后跟大写字母或另一个下划线,则在任何地方都保留。选择不同的类名是个好主意。

于 2010-05-05T03:07:26.770 回答
3

一些东西

  1. 在班级前面使用 _ 是一个非常糟糕的主意 (tm)。从 c++ 标准:

17.4.3.2.1 全局名称 [lib.global.names] 某些名称集和函数签名始终保留给实现:

  • 每个包含双下划线 (_ _) 或以下划线后跟大写字母 (2.11) 的名称都保留给实现以供任何使用。
  • 每个以下划线开头的名称都保留给实现用作全局名称空间中的名称。165

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

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

  2. 正如其他人已经提到的那样,您需要将您的运算符重载声明为朋友。而不是你所拥有的

    log operator+ ( const double b ) const;

    将其更改为

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

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

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

    改变基本配方

  4. 数学中的系数是指乘以对数的部分。所以如果你有 A log_b(x) = y

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

于 2010-05-05T06:15:37.507 回答
1

一些想法:

  1. 不要使用前导下划线命名。此类标识符在 C 和 C++ 中具有放射性。
  2. 在浮点运算之前定义对数之间的运算。
  3. 将#2 与 James 的建议结合起来:

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

    logarithm::logarithm( double f );
    

    现在 C++ 会将 转换为doublealogarithm或.1.0 + my_logmy_log + 1.0

  5. 在您的班级中实施自然对数。不要打扰base
  6. 根据函数定义基本转换:

    double alternate_base( double base ) const;
    

    碱基转换只是简单地除以logarithm备用碱基的自然对数。将整数和小数部分一起返回到一个double.

于 2010-05-05T05:04:20.057 回答