2

在我问我的问题之前:是的,这是大学的作业。

任务非常简单:实现带有附加功能的 Whist 纸牌游戏。助手希望我们与继承“见面”(这是我第二次学习这门课程,所以,我知道它是什么)并告诉我们为我们的 Card 类使用以下内容:创建一个基类 Card 从中派生根据他们拥有的花色(心形,钻石,...),继承了 4 个类。

我发现我自己在这里使用继承很奇怪(因为这些类.fSuit无论如何都会有数据成员)而且我们还没有看到virtual,所以我们不会在这里使用它。这并不难编码,但我遇到的问题是:我们需要派生operators来比较卡片,但派生类可能不会相互比较(编译器应该根据助手抛出错误)。我第一次使用friend bool operator<(Card&, Card&),但我了解到友元函数与派生类没有任何关联,派生类的处理就好像它们是基类一样。

我应该如何让我的代码按照他想要的方式工作?我知道我可以停止使用friend并将运算符作为 Card 类的一部分,但我仍然可以将派生类相互比较。我错过了什么吗?提前非常感谢。

ps:如果它以任何方式编写解决方案都不干净,我不妨在比较之前检查我的 Card 类的操作符部分中的套装。

编辑:他还想让一个运算符 def/decl 一次为所有派生类工作。为每个派生类创建一个友元运算符也是一种可能的解决方案。

4

4 回答 4

2

我想最简单的解决方案是不在operator<基类中实现,而只在派生类中实现(每个类只能与自身进行比较,编译器不允许将 dimond 与心脏等进行比较)

这很愚蠢,但可能会回答您的问题,这可能是您应该做的。

于 2012-12-14T16:20:57.930 回答
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<

于 2012-12-14T16:22:16.213 回答
1

你可以在这里使用友元函数,但你必须声明它接受两个参数

class Card {
public:
    friend bool operator<(const Card &c1, const Card &c2);
    ...
};
于 2012-12-14T16:21:09.507 回答
1

如果您了解游戏规则,那么按照您的导师要求的方式构建课程可能是有意义的。

在这个游戏中,4 名玩家中的每人将从 52 张常规牌组中获得 13 张牌。然后比赛进行 13 轮,称为特技。在每一轮中,最后一轮的获胜者决定必须打出哪个花色,其他人可以跟随花色,打一张王牌(其花色由捐赠者的最后一张牌决定)或任何其他牌(然后比任何花色或王牌都弱)。因此,<操作员将根据这些参数为每场比赛(因为王牌从一场比赛到下一场比赛)和每一轮(因为从一轮到下一轮的花色不同)改变含义。

你的类界面看起来很正常。尝试弄清楚比较运算符代码必须如何更改。不知何故,您必须跟踪游戏回合,选择哪一种花色,以及哪一种是王牌。这些参数可能应该是祖先的一部分,而每个专业类都会检查它们是否等于王牌或当前回合的第一张牌颜色。

我认为您不需要为此使用friend函数。

理想情况下,游戏机制可能应该与卡片处理部分分开,但我想你可以将这些混合到你的代码中来完成这个任务,因为它是为了研究语言的继承方面。

于 2012-12-14T17:48:36.783 回答