Classe abstraite et polymorphisme
Bonjour à tous,
J'essaye de construire l'architecture d'un jeu de carte en C++ (pour bien m'entraîner) et j'ai les classes suivantes :
Une classe abstraite Card qui ne peut pas être instanciée :
Code:
1 2 3 4 5 6 7 8 9
| class Card {
private:
std::string type;
public:
Card(std::string type);
virtual ~Card() = 0;
std::string getType();
}; |
Une classe abstraite ColorCard qui hérite de Card, elle même ne pouvant pas être instanciée :
Code:
1 2 3 4 5 6 7 8 9
| class ColorCard : public Card {
private:
std::string color;
public:
ColorCard(std::string type, std::string color);
virtual ~ColorCard() = 0;
std::string getColor();
}; |
Et enfin une classe NumberCard qui hérite de ColorCard :
Code:
1 2 3 4 5 6 7 8
| class NumberCard : public ColorCard {
private:
int number;
public:
NumberCard(std::string color, int number);
int getNumber();
}; |
J'ai une première question : est-ce la bonne façon de déclarer une classe abstraite en mettant un constructeur virtuel = 0? (l'idée est de se rapprocher des classes abstraites en Java).
Maintenant j'ai une classe Player, qui contient une liste de cartes (sa main) :
Code:
1 2 3 4 5 6 7 8 9
| class Player {
private:
int id;
std::vector<Card> cards;
public:
Player(int id);
void addCard(Card card);
}; |
On peut ajouter une carte grâce à la méthode addCard de Player cependant, le fait d'avoir défini la classe abstraite Card m'empêche d'utiliser le polymorphisme (qui marcherait correctement en Java) et j'ai l'erreur suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| In file included from src/Player.cpp:3:
src/Player.hpp:16:27: error: cannot declare parameter card to be of abstract type Card
16 | void addCard(Card card);
| ~~~~~~~~~~~^~~~
In file included from src/Player.hpp:6,
from src/Player.cpp:3:
src/card/Card.hpp:8:7: note: because the following virtual functions are pure within Card:
8 | class Card {
| ^~~~
src/card/Card.hpp:14:11: note: virtual Card::~Card()
14 | virtual ~Card() = 0;
| ^
src/Player.cpp:8:33: error: cannot declare parameter card to be of abstract type Card
8 | void Player::addCard(Card card) { cards.push_back(card); }
| ~~~~~~~~~~~^~~~ |
Quelle est la bonne façon de faire?
Merci d'avance