繁体   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