2013-05-12 55 views
0

我一直在試圖理解在這段代碼中重載操作符的用法,但是,我無法繞過它。我不完全理解重載操作符的用途或爲什麼需要它。我知道這是一個新手問題,但如果有人能解釋它,我將不勝感激。重載操作符,在這個例子中覆蓋操作符的目的是什麼

const int Card::operator+(const Card& B) 
{ 
if ((faceValue ==1 || B.faceValue == 1) && (faceValue + B.faceValue)<= 11) 
    return 10 + faceValue + (B.faceValue); 
else 
    return faceValue + (B.faceValue); 

} 

再次,我真的很感謝這方面的幫助。

回答

4

「目的」是將兩個對象Card加在一起。通常,您只能使用+在C和C++中添加整數類型,指針類型[使用整數類型]和浮點類型。其他任何事情都需要一個特殊的操作員。

它內部的實際數學似乎是大酒杯的某些部分,其中ACE根據具體情況計爲110

編輯:我個人不認爲這是operator+的好用,因爲operator+的期望是將兩件事情加在一起,不適用邏輯,然後根據一些「遊戲規則」做不同的添加。這遵循「沒有驚喜」的規則。應該使用具有合理名稱的函數,例如CalculateHand

編輯2:除了上面的「思考」,我還要補充說,不應該在Card中處理卡牌遊戲的邏輯。遊戲的邏輯屬於任何「處理」牌 - 無論遊戲是什麼,撲克牌,BlackJack或Solitaire,牌都應該表現完全一樣。

+0

優秀的第二次編輯。 – 2013-05-12 09:28:30

+0

我會同意你100%,這部分是我問這個問題的原因。我認爲你也是這樣,你會把邏輯放到另一個班級。但是,這是一個類的任務,我只是想了解爲什麼使用重載操作符以及將來如何使用它。這段代碼是由老師指定的,我和它無關。不幸的是...... – BobMan 2013-05-12 10:26:06

+0

說到這裏,我仍然覺得很蠢。例如,我不知道重載的操作符如何處理'const Card&b'。我現在應該把這個問題解決掉,抱歉不斷問相同的問題。 – BobMan 2013-05-12 10:32:54

3

它是恕我直言的一個很好的例子,當你應該不是使用運算符重載。看起來代碼返回根據特定遊戲規則計算的值。也許BlackJack,但沒關係。我認爲在這種情況下,它最好是一個具有適當名稱的函數,而不是重載運算符+,因爲後者對於卡沒有一般概念。

+0

我同意這一點。 – 2013-05-12 08:00:24

+0

我有點不同意。我確實同意運營商的超載不應該給運營商帶來令人驚訝的目的。但是,我已經看到,對於某些特定的庫(我在此有意使用庫),當且僅當它們很好地解釋操作符的行爲時,具有不同含義的操作符纔有意義。比如,對於一個深奧的二十一點庫(讓我們命名爲libbjack)或者命名空間(bjack::),用這個實現重載+並且解釋它聽起來對我來說聽起來不是一件壞事。 – 2013-05-12 08:22:54

+0

@PolynomialsEqualities即使這樣,它也沒什麼意義,因爲BlackJack可以讓你擁有兩張以上的卡片(根據我剛剛在維基百科上閱讀的內容,從未玩過那款遊戲)。 '卡a,b,c;'不允許'a + b + c',如果你用'int + Card'增加一個超載,事情會變得更糟,因爲錯誤的可能性會增加。但是,好的,如果你把它放在名字空間'BlackJack'(這不是OP的問題的一部分),你可能會逃脫它:) – 2013-05-12 10:27:11

0

無論何時您對用戶定義的類型進行操作(例如:Card類中的此處的對象),都會出現操作符重載。 '+'運算符用於像int,float,double這樣的基本數據類型。所以你在這裏做的是增加'+'的功能來操作類對象。

另外@Mats Petersson提到的是正確的,你不應該在運算符重載函數中施加任何邏輯,而應該在需要時使用不同的函數。