【发布时间】:2018-02-04 11:59:21
【问题描述】:
我有以下课程:
class Card {
void rotate();
};
class Type1Card : public Card {};
class Type2Card : public Card {};
class Deck {
Card& draw_card();
};
class Board {
std::vector<Card const*> cards;
void put_card(Card const&);
};
所以套牌管理卡片。它返回一张卡片的reference。然后可以将一张卡片放在板上 - 使用 const reference 表示它不能是nullptr 也不能更改。如您所见,Board 存储指向卡片的指针(由于多态化)。
有问题的代码:
auto card = deck.draw_card(); // a copy of a card is created
card.rotate();
board.put_card(card); // board will get a pointer to a temporary variable
我看到的解决方案:
-
draw_card返回一个指针 - 丑陋,因为我相信那个指针 是表示可以返回nullptr- 不正确 -
put_card得到一个指针 - 为什么不和上面一样 - 禁用 Card 的复制构造函数 - 丑陋,因为这不是 Card 的问题 - 没有理由限制 Card 类
【问题讨论】:
-
你要
auto&吗? -
你真的需要多态卡吗?这似乎是一个奇怪的设计......
-
我想我需要。我想放尽可能少的代码。但是在甲板上我有更多类型的牌(一些行动牌,不能放在板上)。而且我认为只有一种类型的卡片会使它有很多未使用的字段并且过于复杂。
-
我不认为这是一个好的设计。我不知道你的游戏规则,但通常情况下,一个操作应该做的不是单张牌,而是多张牌的组合。您当前的设计将不可避免地让您陷入
dynamic_cast和typeid的大混乱,无论您有两个或更多Card&s 并且需要决定适用于它们的游戏规则。