2011-02-25 48 views
0

我重載兩個+和+ =運算符,具有以下特徵:+ =運算符重載,但使用不會編譯,因爲它看到一個簡單的+操作

// within A's header file.. 
A operator+(const B &p);  
A &operator+=(B &p); 

爲什麼,當我嘗試使用+ =運算符,我得到的編譯器錯誤消息的類型「A *」和 「B *」二進制「運營商+」

無效的操作數。

an_a; // an instance of class A 
B *a_b = new B(some_parameters); 
an_a += a_b; 

回答

5

你超載運營商B&。你試圖傳遞一個指針,而不是B或參考B.以下應編譯的一個實例:an_a += *a_b;,但更可能的解決方法是:

A an_a(some parameters); 
B a_b(some parameters); 
an_a += a_b; 

而且提防動態分配和算術運算符重載不要特別好地一起玩。如果只是動態分配的輸入,它可能沒問題。只是不要試圖用new分配結果並返回一個指針,否則你會發現,爲了避免內存泄漏調用代碼不能使用任何是你想要的原因,簡單的表達運算符首先被超載。

+0

即使取消引用它(an_a + =(* A_B))是錯誤的,雖然 – headch 2011-02-25 19:47:45

+1

啊,對不起,我錯過了你的報告的錯誤消息,您的代碼段不同意。代碼中的註釋聲明'an_a'是類A的一個實例,但錯誤消息聲稱它不是,它是一個指針。你不能在兩邊都重載'operator + ='指針,所以如果兩個操作數都是指針,那麼我認爲'p1 + = p2'總是意味着'p1 = p1 + p2'。 – 2011-02-25 19:49:40

+0

......反正或者,既沒有'P1 + = p2'不'P1 = P1 + p2'是有效的,你不能讓他們有效使用操作符重載。不過,我不知道爲什麼編譯器會以這種特殊的方式抱怨,而不是抱怨'operator + ='失敗。 – 2011-02-25 20:01:52

2

你的錯誤信息是在你的代碼中的註釋不一致。它看起來像兩個an_aa_b是指針,所以你必須要提領他們使用運營商:*an_a += *a_b;

另外請注意,您的operator+=通過非const引用,採用B。如果你改變這個操作者的右手論點,某個人會在某個時候感到非常驚訝和不快。改爲使用const參考。

+1

「非常驚訝和不快樂」,很好的捕獲,並且出於同樣的原因'operator +'應該採用const LHS。所以如果它被定義爲一個成員函數,'A運算符+(const B&)const;' – 2011-02-25 19:58:35

相關問題