Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中实现对数运算符重载+; 我在C++中使用运算符重载实现对数类时遇到一些问题。_C++_Operator Overloading_Logarithm - Fatal编程技术网

在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);