2010-05-05 89 views
2

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

我的第一个目标是我将如何实施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); 
}; 

你们是真棒,谢谢您的时间。

+0

你能更具体地关于难以实施基地的变更? – 2010-05-05 03:15:14

+0

@詹姆斯,对不起。我会编辑我的答案。 – 2010-05-05 04:30:37

+0

什么是“系数”和“数字”?见http://en.wikipedia.org/wiki/Common_logarithm:常用名称是“特征”还是“尾数”? – Potatoswatter 2010-05-05 04:34:12

回答

3

有几件事情

  1. 在教室前面使用一个_是一个非常糟糕的主意(TM)。从C++标准:

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

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

165)这样的名字也保留在namespace :: std(17.4.3.1)中。

  • 我猜您使用_log代替日志由于与在CMATH日志()的冲突。出于这个原因,将自己的类保留在标准名称空间中是一个非常糟糕的想法。也许下一个版本的标准将提供一个_log或Logarithm类? 总结自己的类中namespace somename {},并通过使用somename::Logarithm()

  • 正如其他人已经提到,您必须声明你的操作符重载,作为朋友引用它。而不是你有什么

    log operator+ (const double b) const;

    将其更改为

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

    ,并定义在命名空间范围的功能。

  • 这里是基础配方的变化数学

    Change of base formula

  • 系数在数学是指乘以日志的一部分。因此,如果你有 甲log_b(x)的= Y

    A是系数,B是基极,和Y是结果(或一些其它的名字)

  • 5

    我的第二个目标是能够执行一个操作,其中左操作数是双倍操作数,右操作数是对数对象。

    要做到这一点,你需要声明的操作员在命名空间内非成员函数(即不是在_log定义),例如,

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

    如果您需要访问的_log私有成员,你可以声明它为_log定义里面的朋友:

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

    注意,开始用下划线(例如,名)保留给全局名称空间中的实现;如果下划线后面跟着大写字母或其他下划线,则它在任何地方都是保留的。选择不同的类名是个好主意。

    +0

    在非会员操作员的情况下,尽量避免说朋友是很好的。既然你已经有了一个成员加成运算符,在这个方面作为非友元非成员函数实现另一个方向是微不足道的。 – Stewart 2010-05-05 05:41:03

    1

    几个想法:

    1. 不要用下划线开头的名字。这种标识符在C和C++中是放射性的。
    2. 在使用浮动操作之前定义对数之间的操作。
    3. 联合#2 James的建议:

      friend logarithm operator+(const logarithm &l, const logarithm &r); 
      
    4. 定义一个转换构造以产生从浮一个logarithm

      logarithm::logarithm(double f); 
      

      现在C++将double转换为logarithm在任一1.0 + my_logmy_log + 1.0

    5. 在您的班级中实施natural logarithms。不要打扰base
    6. 定义在功能方面基本转换:

      double alternate_base(double base) const; 
      

      基地转换简单地通过自然对数的替换基座的分割logarithm。将整数和小数部分一起返回到一个double可能是最方便的。