在C+中实现对数运算符重载+; 我在C++中使用运算符重载实现对数类时遇到一些问题。
我的第一个目标是如何实现在C+中实现对数运算符重载+; 我在C++中使用运算符重载实现对数类时遇到一些问题。,c++,operator-overloading,logarithm,C++,Operator Overloading,Logarithm,我的第一个目标是如何实现changeBase方法,我一直在绞尽脑汁 我曾试图理解改变对数底背后的数学原理,但我一直无法理解。谁能给我解释一下吗 我的第二个目标是能够执行一个操作,其中左操作数是双精度的,右操作数是对数对象 下面是我的日志类的一个片段: // coefficient: double // base: unsigned int // result: double class _log { double coefficient, result; unsigned int base
changeBase
方法,我一直在绞尽脑汁
我曾试图理解改变对数底背后的数学原理,但我一直无法理解。谁能给我解释一下吗
我的第二个目标是能够执行一个操作,其中左操作数是双精度的,右操作数是对数对象
下面是我的日志类的一个片段:
// 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 );
};
//系数:双精度
//基:无符号整数
//结果:加倍
类日志{
双系数,结果;
无符号整数基;
公众:
_日志(){
基数=10;
系数=0.0;
结果=0.0;
}
_日志运算符+(常数双b)常数;
_日志运算符*(常数双b)常数;
_日志运算符-(常量双b)常量;
_对数运算符/(常数双b)常数;
_日志操作员
我的第二个目标是能够执行一个操作,其中左操作数是双精度的,右操作数是对数对象
为此,您需要在命名空间范围中将运算符声明为非成员函数(即,不在\u log
的定义中),例如
如果您需要访问\u log
的私人成员,可以在\u log
的定义中将其声明为好友:
friend _log operator+(const double a, const _log& b);
请注意,以下划线开头的名称(例如,\u log
)保留给全局命名空间中的实现;如果下划线后跟大写字母或另一个下划线,则在任何地方都保留该名称。最好选择不同的类名。一些想法:
不要用一个主要的下划线来命名。这样的标识符在C和C++中是放射性的。
在使用浮点运算之前,定义对数之间的运算
将#2与詹姆斯的建议结合起来:
friend logarithm operator+( const logarithm &l, const logarithm &r );
定义转换构造函数以从浮点生成对数:
logarithm::logarithm( double f );
<>现在C++将将<代码>双<代码>转换为<代码>对数<代码>在<代码> 1 + MyLogLo> < /C>或<代码> MyLogL+ 1 < < /P>
在您的类中实现。不要为base
操心
根据函数定义基本转换:
double alternate_base( double base ) const;
基数转换就是将对数除以另一个基数的自然对数。在一个双中返回整数和小数部分可能是最方便的
几件事
使用前面的类是一个非常坏的想法(TM)。C++标准:
17.4.3.2.1全局名称[lib.Global.names]
某些名称和函数签名集始终保留给
实施:
- 每个名称都包含一个双下划线(u_u)或以开头
后跟大写字母的下划线
信函(2.11)保留给
实现任何用途
- 以下划线开头的每个名称都保留给
在中用作名称的实现
全局名称空间。165
165)此类名称也保留在namespace::std(17.4.3.1)中
我猜您使用了_log而不是log,因为它与cmath中的log()冲突。正是因为这个原因,在标准名称空间中保留自己的类是一个非常糟糕的主意。也许标准的下一个版本将提供_log或对数类?
将您自己的类包装在名称空间somename{}
中,并使用somename::对数()引用它
正如其他人已经提到的,您需要将运算符重载声明为friend,而不是您所拥有的
日志运算符+(常数双b)常数;
换成
friend log operator+(const double d, const log& l);
并在命名空间范围中定义函数
这是更改基本公式的数学公式
数学中的系数指的是乘以对数的部分
A log_b(x)=y
A是系数,B是基数,Y是结果(或其他名称)
你能更具体地说明一下你在实施基数变更时遇到的困难吗?@James,对不起。我会编辑我的答案。什么是系数
和数字
从函数中派生,从未永久存储在这样的结构中。此外,对数的小数部分在哪里?如果你想在3之外的基数中表示数字3,你会怎么做?在非成员运算符的情况下,最好尽量避免说friend。因为你已经有了一个成员加法运算符,实现了另一个d方向作为一个非友元非成员函数在这方面是微不足道的。
friend log operator+(const double d, const log& l);