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

时间:2014-09-01 22:17:31

标签: c++ arrays class object subclass

我正在尝试使用两个类来模拟一副牌,“类甲板”和“类卡:公共甲板”。我希望/ deck /类有一个方法来按顺序初始化52个对象数组中的卡片,我以后也可以随机播放。

我该怎么做? (我需要使用类进行此任务 - 我们尚未学习向量)

2 个答案:

答案 0 :(得分:4)

Card派生Deck的方法不正确。当您输入class Card : public Deck时,您在卡片组和卡片组之间建立了 is-a 关系,因此CardDeck。当然,这是不对的。

您希望牌组成为一系列牌,而您甚至不需要新的数据类型。

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;
}

如果你坚持为甲板上课,那也可以通过封装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的数组有一些含义。其中之一是,如果某些卡从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

};

答案 1 :(得分:3)

如果你不能使用vector并且坚持为一个套牌设一个单独的类,那么你应该有Deck持有Card s的数组:

class Deck {
    Card cards[52];
};