2012-12-14 69 views
2

在我問我的問題之前:是的,這是大學的一項任務。繼承比較運算符而不能比較派生類與對方

該分配非常簡單:實施具有附加功能的惠斯特紙牌遊戲。助理希望我們繼承「繼續」(這是我第二次跟隨這個過程,所以我知道它是什麼),並告訴我們使用以下卡片類:創建一個基類卡,從中派生出來根據他們所擁有的套裝(心臟,鑽石,...)繼承4類。

我覺得這很奇怪我在這裏使用繼承(因爲這些類將有.fSuit數據成員反正),我們還沒有看到virtual還,所以在這裏我們不會使用它。這並不難,但我遇到的問題是:我們需要派生operators來比較卡片,但派生類不能相互比較(編譯器應該根據助手丟出錯誤) 。我第一次使用friend bool operator<(Card&, Card&),但我知道朋友函數不以任何方式與派生類相關聯,派生類的處理就像它們是基類一樣。

我該如何讓自己的代碼按照他想要的方式工作?我知道我可以停止使用friend並使運算符成爲我的Card類的一部分,但我仍然可以將派生類與其他類進行比較。我錯過了什麼嗎?提前致謝。

ps:如果它不是以任何方式爲它編碼的解決方案,我可能只是在比較之前檢查我的卡類的運算符部分中的套裝。

編輯:他還希望一次對所有派生類進行一個運算符的def/decl工作。爲每個派生類創建一個朋友操作符也可能是一個可能的解決方案。

+0

你的代碼像atm是什麼? – didierc

+0

http://pastebin.com/XPkWGHmA適用於現在對頭文件感興趣的人。 – Shiouen

回答

1

如果你知道遊戲的規則,也許按照你的教練的要求建立這個類是有意義的。

在這場比賽中,4名球員中的每一名將從普通的52張牌組中獲得13張牌。然後這場比賽被稱爲技巧的13輪。在每一輪中,最後一輪的獲勝者決定必須打哪一套,其他人可能會效仿,打一張王牌(其套裝由捐贈者的最後一張牌決定),或任何其他卡(然後將比任何套裝或王牌都弱)。因此,運營商將根據這些參數爲每場比賽改變意義(因爲每場比賽的王牌不同),並且每輪(因爲每場比賽的花色不相同) 。

你的類接口看起來非常符合要求。試着弄清楚比較運算符代碼是如何改變的。不知何故,你必須跟蹤遊戲輪次,選擇哪一套,以及哪一套是王牌。這些參數可能應該是祖先的一部分,而每個專門的類將檢查它們是否等於當前輪的王牌或第一張牌的顏色。

我不認爲你需要使用friend功能。

理想情況下,遊戲機制應該可以從卡片處理部分分離出來,但我想你可以在代碼中混合這些來完成這個任務,因爲它用於研究語言的繼承方面。

+0

這確實是助理的想法(每輪都有王牌或某些套裝)。在那裏找到!我會繼續這種工作方式,畢竟這是關於學習的。感謝您的回覆,在思考更多關於您如何設法找出不同方式來跟蹤遊戲中的王牌/當前套裝時,我實際上可能會有一個想法:爲卡片提供額外信息(無論是王牌卡/當前套裝),並讓遊戲決定它們是否在填充卡中的數據字段之前進行比較。這可能有很多種可能。感謝您的回覆! – Shiouen

2

我想簡單的辦法就是不落實operator<在基類,但只有在派生類(每個類只能與自己相比和編譯器將不允許蒂蒙德比較心臟等)

這是很愚蠢,但可能會回答你的問題,這可能是你應該做的。

+0

查看第一個答案中的答覆,我同意它可以解決問題,以防萬一我不必爲派生類使用一個操作符函數。 – Shiouen

1

你可以在這裏使用一個朋友的功能,但你必須聲明它取兩個參數

class Card { 
public: 
    friend bool operator<(const Card &c1, const Card &c2); 
    ... 
}; 
+0

是的,我的不好,在OP中編輯。儘管如此,我仍然可以比較派生類。不過謝謝你,我在參數後面使用const是非常愚蠢的(因爲friend函數不是類的一部分,所以在使用friend bool操作符<(const Card&c1,const Card&c2)const ;它給出了一個錯誤。) – Shiouen

2

如果你想要這個

class Card {}; 
class Hearts : public Card {}; 
Hearts a,b; 
a < b; 

編譯,但不是這個

class Card {}; 
class Hearts : public Card {}; 
class Diamonds : public Card {}; 
Hearts a; 
Diamonds b; 
a < b; 

然後,您不得提供通用operator<(Card&),但只有operator<成員爲每個派生類。

+0

在op中編輯,助理表示,我們應該嘗試使用一個函數爲每個操作符。 – Shiouen