Bonjour,
La question que je vais poser ici est basique, mais le fait est que je n'arrive pas à y trouver de réponse. Je n'arrive pas à saisir comment utiliser le correctement polymorphisme.
Je prends un exemple très simple pour illustrer mon problème :
Imaginons que je veuille faire un jeu, qui contiendrait de nombreux objets différents ayant tous leurs propres spécificités ainsi que certains points en commun (des joueurs, des arbres, des armes...). Si je les stocke par polymorphisme sur un pointeur, comme ceci :
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
16
17
18
19
20
21
22
23 class Transformable { protected : float pos_x; float pos_y; float rotation; }; class Player : public Transformable { public : void set_name( const std::string& name ); protected : std::string name; }; class Building : public Transformable { public : void open_door( void ); protected : bool is_door_open; };
Tous mes objets sont stockés dans la même liste, mais je perds l'accès aux méthodes des classes filles de Transformable. Je sais bien qu'il est possible d'employer des virtuelles pures pour surplanter des méthodes de la classe mère, mais imaginons que mes classes filles possèdent certaines méthodes qui leur sont propres. Il y a possibilité de downcaster, mais j'ai lu que c'était à éviter car crado. Pour contourner le problème, je pourrais stocker mes objets par catégorie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 std::list< Transformable* > object_list; object_list.push_back( new ( Player ) ); object_list.push_back( new ( Player ) );
Sauf que ça me paraît franchement sale, surtout si il y a beaucoup d'objets différents et que les listes se multiplient.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 std::list< Player* > players_list; std::list< Building* > buildings_list;
Du coup, j'en arrive à ma question : Comment stocker mes objets de la manière la plus générique possible sans pour autant perdre des méthodes au passage? Quelle est la manière idéale de faire cela en C++?
Merci d'avance.
Partager