2014-09-01 2 views
-2

"클래스 갑판"과 "클래스 카드 : 공개 갑판"의 두 클래스를 사용하여 카드 갑판을 시뮬레이션하려고합니다./deck/class가 52 객체 배열의 카드를 순서대로 초기화하는 메소드를 갖기를 원합니다. 나중에이 배열을 셔플 할 수 있습니다.C++ : 단일 수퍼 클래스의 배열 하위 클래스?

어떻게하면됩니까? (나는이 과제를 위해 클래스를 사용해야한다. 아직 벡터를 배웠다.)

+0

을 무슨 문제? –

+5

왜'카드'는'갑판 '의 전문화가 될까요? – juanchopanza

+0

데크는 카드의 컨테이너 일 수 있습니다. 'std :: vector deck;'거기에는 상속이 필요 없습니다. –

답변

4

CardDeck에서 파생되는 접근 방식이 잘못되었습니다. class Card : public Deck을 입력하면 이 카드와 데크 사이에 인 관계이므로 CardDeck입니다. 당연히 이것은 옳지 않습니다.

덱이 일련의 카드가되기를 원하고 새로운 데이터 유형이 필요하지 않습니다.

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

당신이 주장하는 경우 : 완벽한 52 카드 갑판을 반환하는 함수를 작성,

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

그리고 마지막으로 : 당신이 원하는 경우

std::vector<Card> 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 배열을 사용하면 몇 가지 의미가 있습니다. 그 중 하나는, 당신은 갑판에 대해 별도의 클래스를 가진에 vector를 사용하고 주장 할 수없는 경우 일부 카드는 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 

}; 
+0

사실 저는 아직 벡터를 배웠지 않았으며 이것은 과제의 일부이기 때문에 수업을 사용하여 그것에 관해 가봐야 만합니다. 명확히하지 않은 것에 대해 사과드립니다. – user3728321

+0

클래스에는 여전히 구현이 필요합니다. 다른 대안으로는 벡터 대신 배열을 사용하는 것입니다. 그러나 벡터는 가장 좋은 접근 방법입니다. 필요한 것은 사용 방법을 알고 있어야하기 때문입니다. –

+0

@ user3728321 벡터는 C 스타일 배열보다 훨씬 사용하기 쉽습니다. –

3

에서 찍은 경우 배열의 모든 슬롯이 실제로 카드를 가질 수없는 것입니다 다음은 DeckCard의 배열 유지해야한다 :

class Deck { 
    Card cards[52]; 
}; 
관련 문제