I am trying to write a derived class called TerminalPlayer that inheritances a class Player given the declaration of virtual const Card playCard(const Card opponentCard) = 0; how would you implement the inherited playCard in the abstract class and what does the = 0 at the end of the prototype mean?
I also have the error in the main testing code that gives the error: cannot allocate an object of abstract type ‘Player’. I think it is because I am not implementing the Player class correctly but I don't know how to fix it.
Player.h
#ifndef PLAYER_H_
#define PLAYER_H_
#include <vector>
#include "Card.h"
#define MAX_HAND_SIZE 3
// Abstract Player classS
class Player {
public:
// Deconstructor
virtual ~Player() {
}
// Play a card. If the player receives a joker then this player is going first
virtual const Card playCard(const Card opponentCard) = 0;
// Receive a card from the dealer
void receiveCard(const Card c) {
hand.push_back(c);
}
// Add points to the score
void addScore(unsigned s) {
score += s;
}
// Get the score
int getScore() const {
return score;
}
// Return true if the player has cards in the hand
bool hasCards() const {
return (hand.size() != 0);
}
// Receive the cards played from the previous round. This member function would be used by a computer player that may need to 'see' what cards were played.
void cardsPlayed(const Card card1, const Card card2) {
}
// Output the players name
friend std::ostream& operator <<(std::ostream& out, const Player& p);
protected:
// Constructor. Since this is an abstract class we do not want anyone instantiating a player class so we make it protected.
Player(std::string name) :
score(0), name(name), hand(0) {
}
int score;
std::string name;
std::vector<Card> hand;
};
#endif
TerminalPlayer.h
#ifndef TERMINALPLAYER_H_
#define TERMINALPLAYER_H_
#include "Player.h"
class TerminalPlayer : public Player {
public:
TerminalPlayer(std::string name);
virtual ~TerminalPlayer();
};
#endif
TerminalPlayer.cpp
#include "Player.h"
Card playCard(const Card opponnentCard){
// TODO: playCard code here
}
Test.cpp
int main(){
// This initialization give error: cannot allocate an object of abstract type ‘Player’
TerminalPlayer player1 = Player("Player1");
return 0;
}
The = 0'
means that this is a pure virtual
function.
This type of function must be defined by any class which inherits from the base class AND is instantiated within a program.
Since your base class declares:
// Play a card. If the player receives a joker then this player is going first
virtual const Card playCard(const Card opponentCard) = 0;
You should implement this function within your derived class. You come close in TerminalPlayer.cpp:
const Card TerminalPlayer::playCard(const Card opponnentCard){
// TODO: playCard code here
}
What you are missing the the TerminalPlayer::
scoping shown above.
Also missing is the function declaration in the derived class. You need to add:
virtual const Card playCard(const Card opponentCard) override;
Within the class TerminalPlayer
. Put it right after the destructor.
That should do it.
One thought: the const qualifier on the return value is not necessary since you are returning by value.