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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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