2013-02-04 68 views
1

我想重寫all =運算符,其中lhs是已知類型,rhs是我自己的類。舉個例子:如何重載operator + =

class MyClass; 
    class Override { 
     long operator+=(long X, const MyClass& Y); 
    } 
    long Override::operator+=(long X, const MyClass& Y) { 
     return X += (long)Y; 
    } 
    void main(int argc, char** argv) { 
     MyClass X(1); 
     long Y = 1; 
     Y += 1;  // works great 
     Y += (long)X; // works great 
     Y += X;  // does not work 
    } 

而MyClass有相應的鑄造和創建方法。

我知道我錯過了什麼,但我無法弄清楚什麼。

我得到

Y += X 

編譯器錯誤用下面的函數

long Override::operator(long& X, const MyClass& Y) ... 

誰能告訴我做的正確的方式,這是什麼呢?

感謝 藝術

+1

你超載有三個參數。 – chris

+1

出於好奇,爲什麼你在覆蓋類中包裝運算符+ =? – 2013-02-04 22:45:52

+0

無論如何,我認爲你的意思是「過載」。重寫是非常不同的。 – chris

回答

2

Override是完全無用的在這裏。只要寫一個全局函數:

long &operator+=(long &X, const MyClass& Y) { 
    return X += (long)Y; 
} 

注意,第一個參數(X)必須通過引用傳遞,因爲它會由運營商進行修改。

+1

'+ ='應該通過引用返回。 – juanchopanza

+1

@juanchopanza:哦,你說的對,C++中的一個賦值的結果(與C不同)是一個l值!糾正。 – rodrigo

+0

真正的MyClass是一個ADT,其中++操作在某些派生類中是非法的。雖然(很久)Y會報告錯誤,但錯誤將是由於非法轉換而非非法操作。但是如果我必須這樣做,那麼我必須這樣做。但是,當我嘗試「長操作符+ =(long&X,const MyClass&Y)」我收到一個錯誤「未定義的引用到'slip :: operator + =(unsigned char,slip :: SlipDatum const&)」(並且此處的代碼使用unsigned char &signed char&long&unsigned long ...)。我不知道如何擺脫錯誤? –

0

像這樣(我創造了一些MyClass的澆注料長只是舉例)

class MyClass 
{ 
    long a; 
    public: 
    MyClass(long a) : a(a) {} 
    operator long() const 
    { 
     return a; 
    } 
}; 

long operator+=(long X, const MyClass& Y) { 
    return X += (long)Y; 
} 
int main(int argc, char** argv) { 
    MyClass X(1); 
    long Y = 1; 
    Y += 1;  // works great 
    Y += (long)X; // works great 
    Y += X;  // works too 
    return 0; 
} 
+0

再次請避免隱式轉換。他們咬人。 – gimpf

+0

您的「長操作符(long X,const MyClass&Y)」沒有「long&X」。以前的海報表示需要引用這個問題嗎? –

+0

謝謝。通過一系列非常愚蠢的編碼錯誤,我創造了一個怪物。你和其他人已經解決了我的問題。 –