簡體   English   中英

繼承比較運算符,而不能相互比較派生的類

[英]Inherit comparison operators without being able to compare the derived classes with each other

在我問我的問題之前:是的,這是大學的作業。

分配非常簡單:使用附加功能實現Whist紙牌游戲。 助手希望我們“繼承”(這是我第二次參加本課程,所以我知道這是什么),並告訴我們在Card類中使用以下內容:創建基類Card根據他們所擁有的西裝(心形,鑽石形,...)分為4個繼承的類別。

我發現自己在這里使用繼承是.fSuit很奇怪的事情(因為這些類無論如何都具有.fSuit數據成員),而且我們還沒有看到virtual ,所以在這里不會使用它。 這並不是很難編寫,但是我有一個問題:我們需要派生operators來比較卡,但是派生的類可能不會相互比較(編譯器應根據助手拋出錯誤) 。 我首先使用friend bool operator<(Card&, Card&)但我了解到Friend函數沒有以任何方式與派生類相關聯,並且派生類被當作基類來處理。

我應該如何以他想要的方式使代碼工作? 我知道我可以停止使用friend並讓運算符成為Card類的一部分,但是我仍然可以將派生的類進行相互比較。 我想念什么嗎? 非常感謝。

ps:如果以某種方式為解決方案編寫代碼不是很干凈,那么在進行比較之前,我不妨先檢查一下Card類中的運算符是否適合。

編輯:他還想讓一個運算符def / decl一次為所有派生類工作。 為每個派生類創建一個Friend運算符可能是一種解決方案。

我猜最簡單的解決方案是不要在基類中實現operator< ,而只能在派生類中實現(每個類只能與自身進行比較,編譯器不允許將dimond與heart比較)。

這是很愚蠢的,但可能會回答您的問題,這可能是您應該執行的操作。

如果你想要這個

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<成員。

您可以在此處使用朋友功能,但必須聲明該功能以接受兩個參數

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

如果您了解游戲規則,那么按照您的教練要求的方式建立課程也許是有意義的。

在這個游戲中,這4位玩家中的每位玩家將從常規的52張卡組中獲得13張卡。 然后,這些游戲將進行13輪,稱為技巧。 在每個回合中,最后一輪的獲勝者決定必須打哪套衣服,其他人則可以跟風,打一張王牌(其花色由捐贈者的最后一張牌決定)或其他任何牌(然后將勝過任何西裝或王牌)。 因此, <運算符將根據這些參數針對每個游戲(因為在一個游戲與下一個游戲之間的勝率不同)和每個回合(因為西裝在一個回合與下一個比賽中都不相同)來改變含義。 。

您的班級界面似乎已步入正軌。 嘗試找出比較運算符代碼必須如何更改。 不知何故,您必須跟蹤比賽,選擇哪套西裝,哪套是王牌。 這些參數可能應該是祖先的一部分,而每個專門類將檢查它們是否等於王牌或當前回合的第一張牌顏色。

我認為您不需要為此使用friend功能。

理想情況下,也許應該將游戲機制與紙牌處理部分分開,但是我想您可以將這些混合在代碼中進行此分配,因為這是為了研究語言的繼承方面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM