C++:单个超类的数组子类

C++: Array subclass of single superclass?

本文关键字:数组 子类 超类 单个 C++      更新时间:2023-10-16

我正试图使用两个类来模拟一副牌,"class deck"answers"class Card:public deck"。我希望/deck/类有一个方法来按顺序初始化52对象数组中的卡,稍后我也可以洗牌。

我该怎么做?(我需要使用类来完成这项任务——我们还没有学习向量)

使CardDeck派生的方法是不正确的。当您键入class Card : public Deck时,您正在卡和甲板之间建立一个is-a关系,因此Card是一个Deck。当然,这是不对的。

你希望一副牌是一系列的牌,而你甚至不需要新的数据类型。

std::vector<Card> deck;

如果你愿意,你可以创建一个别名:

using Deck = std::vector<Card>;
Deck deck;

最后,创建一个返回完整的52副牌的函数:

Deck create52CardDeck(void) {
    Deck deck;
    // your code here, use push_back to add cards to the deck
    return deck;
}

如果您坚持要为Deck创建一个类,也可以通过封装std::vector:来实现

class Deck {
    std::vector<Card> vector;
public:
    // make an empty deck
    Deck(void) = default;
    // then you can make your own methods:
    static Deck create52CardDeck(void) { ... }
    void shuffle() { ... } 
    Card takeFromTop(void) { ... }
    void putCardOntop(Card c) { ... }  // or const Card& argument
};

另一种选择是使用一组卡片,甚至是一个链表,而不是std::vector。然而,这使得一些操作的实施更加复杂。尽管我在这里添加了它,但有一个Card s的阵列也有一些含义。其中之一是,如果从52中取出一些卡,那么阵列中的所有插槽实际上可能都有一张卡。

class Deck {
    Card cards[52];
    unsigned int ncards;
public:
    // make an empty deck 
    Deck(void) : ncards(0)
    {}
    // the other methods will have to manipulate the array properly
};

如果你不能使用vector并坚持为一副牌有一个单独的类,那么你应该有一个Deck,里面有一个数组Cards:

class Deck {
    Card cards[52];
};