13.5. Deck
member functions¶
Now that we have a Deck
object, it makes sense to put all the
functions that pertain to Deck
s in the Deck
structure
definition. Looking at the functions we have written so far, one obvious
candidate is printDeck
(Section 12.7).
Here’s how it looks, rewritten as a Deck
member function:
void Deck::print () const {
for (size_t i = 0; i < cards.size(); i++) {
cards[i].print ();
}
}
As usual, we can refer to the instance variables of the current object without using dot notation.
The active code below prints out the deck of cards like in the previous section. Notice we can just use deck.print ()
to print out the deck instead of writing a for loop in main.
For some of the other functions, it is not obvious whether they should
be member functions of Card
, member functions of Deck
, or
nonmember functions that take Card
s and Deck
s as parameters.
For example, the version of find
in the previous chapter takes a
Card
and a Deck
as arguments, but you could reasonably make it a
member function of either type. As an exercise, rewrite find
as a
Deck
member function that takes a Card
as a parameter.
Writing find
as a Card
member function is a little tricky.
Here’s my version:
int Card::find (const Deck& deck) const {
for (size_t i = 0; i < deck.cards.size(); i++) {
if (equals (deck.cards[i], *this)) return i;
}
return -1;
}
The first trick is that we have to use the keyword this
to refer to
the Card
the function is invoked on.
The second trick is that C++ does not make it easy to write structure definitions that refer to each other. The problem is that when the compiler is reading the first structure definition, it doesn’t know about the second one yet.
One solution is to declare Deck
before Card
and then define
Deck
afterwards:
// declare that Deck is a structure, without defining it
struct Deck;
// that way we can refer to it in the definition of Card
struct Card {
int suit, rank;
Card ();
Card (int s, int r);
void print () const;
bool isGreater (const Card& c2) const;
int find (const Deck& deck) const;
};
// and then later we provide the definition of Deck
struct Deck {
vector<Card> cards;
Deck ();
Deck (int n);
void print () const;
int find (const Card& card) const;
};
- Use the keyword this.
- We use this to refer to the Card that the function is invoked on.
- Define Deck before Card.
- We don't have to define Deck before Card.
- Pass a Card parameter in the Card member function find.
- What do we pass as a parameter in find?
- Declare Deck before Card and then define Deck afterwards.
- This is how we implemented our code!
Q-2: Multiple Response: What are some tricks we can use to write find
as a Card
member function?
Write find as a Deck member function that takes a Card as a parameter.
The active code below uses the find
function that we just wrote.