【问题标题】:How to inherit only a method of a class, not the whole class itself (C++)如何仅继承类的方法,而不是整个类本身(C++)
【发布时间】:2021-07-19 16:30:00
【问题描述】:

我有两个类 - DeckPlayer,结构如下:

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&amp; Player::getDeck())
  • @dyp 那么您也可以将其设为公共成员。但这没有必要,恕我直言糟糕的设计。
  • 我使用指针向量而不是对象向量,因为Card 类实际上有两个子类。我省略了此信息,因为它与问题无关。向量应该存储不同类型的卡片,而不是制作两个对象向量,我制作了一个可以存储所有卡片的向量。
  • @JHBonarius 没错,不需要保护类不变量的成员可以是公共的。我不认为那个糟糕的设计:) 或者更确切地说,不是一个给定设计的糟糕实现。

标签: c++ class oop inheritance


【解决方案1】:

我认为你当前的设计很好,但是如果你真的想要,你可以在你的甲板类中创建你不想访问的方法,private,如果你有的话希望能够访问该私有方法的类,您将该类设为 friend 类。

【讨论】:

  • 这并不总是一个好的设计......你应该“保密”。请注意,友谊不是继承的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多