2010-05-05 92 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可能是最方便的。