This is the exercise I?m trying to solve. It's from C++, How to program book from Deitel and it's my homework.
(Card Shuffling and Dealing) Create a program to shuffle and deal a deck of cards. The
program should consist of class Card, class DeckOfCards and a driver program.
Class Card should
provide:
a) Data members face and suit of type int.
b) A constructor that receives two ints representing the face and suit and uses them to initialize
the data members.
c) Two static arrays of strings representing the faces and suits.
d) A toString function that returns the Card as a string in the form “face of suit.” You
can use the + operator to concatenate strings.
Class DeckOfCards should contain:
a) A vector of Cards named deck to store the Cards.
b) An integer currentCard representing the next card to deal.
c) A default constructor that initializes the Cards in the deck. The constructor should use
vector function push_back to add each Card to the end of the vector after the Card is
created and initialized. This should be done for each of the 52 Cards in the deck.
d) A shuffle function that shuffles the Cards in the deck. The shuffle algorithm should
iterate through the vector of Cards. For each Card, randomly select another Card in the
deck and swap the two Cards.
e) A dealCard function that returns the next Card object from the deck.
f) A moreCards function that returns a bool value indicating whether there are more Cards
to deal.
The driver program should create a DeckOfCards object, shuffle the cards, then deal the 52 cards.
The problem I'm facing is that I don't know exactly how to make the constructor for the second class. See description commented in the code bellow.
#include <iostream>
#include <vector>
using namespace std;
/*
*
*/
//Class card. No problems here.
class Card
{
public:
Card(int, int);
string toString();
private:
int suit, face;
static string faceNames[13];
static string suitNames[4];
};
string Card::faceNames[13] = {"Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Queen","Jack","King"};
string Card::suitNames[4] = {"Diamonds","Clubs","Hearts","Spades"};
string Card::toString()
{
return faceNames[face]+" of "+suitNames[suit];
}
Card::Card(int f, int s)
:face(f),
suit(s)
{
}
/*The problem begins here. This class should create(when and object for it is created)
a copy of the vector deck, right? But how exactly are these vector cards be initialized?
I'll explain better in the constructor definition bellow.*/
class DeckOfCards
{
public:
DeckOfCards();
void shuffleCards();
Card dealCard();
bool moreCards();
private:
vector<Card> deck(52);
int currentCard;
};
int main(int argc, char** argv) {
return 0;
}
DeckOfCards::DeckOfCards()
{
//This is where I'm stuck. I can't figure out how to set each of the 52 cards of the vector deck to have a specific suit and face every one of them, by using only the constructor of the Card class.
//What you see bellow was one of my attempts to solve this problem but I blocked pretty soon in the middle of it.
for(int i=0; i<deck.size(); i++)
{
deck[i]//....There is no function to set them. They must be set when initialized. But how??
}
}
For easier reading: http://pastebin.com/pJeXMH0f