【发布时间】:2021-07-19 16:30:00
【问题描述】:
我有两个类 - Deck 和 Player,结构如下:
class Deck {
public:
//constructors, destructors, operator=
void addCard(const Card &card);
bool changeCard(const unsigned int &index, const Card &card);
void clearDeck();
//other things
private:
std::vector<Card *> cards;
};
class Player {
public:
//constructors, destructors, operator=
void changeCardInDeck(const unsigned int &index, const Card &card);
void addCardInDeck(const Card &card);
//other things
private:
std::string name;
Deck *deck;
};
如您所见,由于Player 类有一个Deck 成员,它包含与Deck 类相同的方法。但是做这样的事情:
void Player::addCardInDeck(const Card &card) {
this->deck->addCard(card);
}
看起来并不简单,所以我正在寻找一种更直接的方法来做到这一点。 但是,继承 `Deck` 类似乎很奇怪,我怀疑拥有指向父类对象的类型指针的成员可能会导致一些问题。所以问题是:我可以只从 Deck 类继承我感兴趣的方法,而不是做上面提到的事情吗?
【问题讨论】:
-
不,设计是正确的。不应该有“更直接的方式”。玩家有一个甲板(不知道你为什么使用指针,但无论如何)。当玩家“将一张牌添加到牌组”时,他会将其放入他拥有的牌组中。他自己不是套牌,例如将卡放在他的$$中。附:尽管可能是有原因的,但卡片 pointers 的向量没有多大意义。尽量少用指针!
-
私有继承+使用声明在某种程度上是可能的。但是,有时甚至不需要封装成员 (
Deck *deck):如果Player不保护任何不变量,则公开Deck也是一种选择 (Deck& Player::getDeck()) -
@dyp 那么您也可以将其设为公共成员。但这没有必要,恕我直言糟糕的设计。
-
我使用指针向量而不是对象向量,因为
Card类实际上有两个子类。我省略了此信息,因为它与问题无关。向量应该存储不同类型的卡片,而不是制作两个对象向量,我制作了一个可以存储所有卡片的向量。 -
@JHBonarius 没错,不需要保护类不变量的成员可以是公共的。我不认为那个糟糕的设计:) 或者更确切地说,不是一个给定设计的糟糕实现。
标签: c++ class oop inheritance