Bonjour à tous,
Je n'arrive pas à m'en sortir dans un cas, avec des templates, que j'aimerai avoir des pointeurs super générique dessus.
Je m'explique
Voici mon code :
J'aimerai pouvoir faire un pointeur de Controler. donc générique au possible. Mais comme ma classe est template, la généricité est stoppée nette une fois un type spécifié (Controler<Type>). Ok, c'est normal.
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
24
25
26
27
28
29
30
31 template <typename GameBoard> class Controler : public Listener<Move<typename GameBoard::Coords> > { typedef typename GameBoard::Coords Coords; private: protected: int m_colorControlled; /*!< Color associated to this controler */ public: /*! \brief Default constructor * Will define an invalid color making this controller basically invalid */ Controler():m_colorControlled(-1) {} // Put an invalid color // virtual ~Controler() = 0; /*! \brief Gets the move that the controler wants to play * This function is generally waiting for the move from the controler. * \return */ virtual Move<Coords> getMove() =0; /*! \brief Defines the color used by the controler * \param color */ virtual void setColorControled(int color) { m_colorControlled = color; } };
La solution en général, c'est de faire une classe abstraite au dessus. Soit, mais en fait, je ne peux pas faire mieux dans ce sens là (j'hérite déjà cette classe).
Mon problème, c'est que je veux vraiment une fonction virtuelle pure getMove() et que en plus celle-ci me retourne le type Coord qui est sous jacent au plateau.
Est ce qu'il existe une solution et quelle serait-elle ?
(Note, le Listener peut être complêtement éjecté, donc ne nous en préoccupons pas)
En écrivant ce message, j'ai pensé que peut être, le type de retour getMove() et donc la fonction, ne devra être spécifié que dans les classe héritante, mais je souhaite vraiment avoir la fonction en virtuelle pure.
Sinon, peut être passer la fonction en fonction template (donc, que le template soit spécifier à l'appel et non à la création de la classe). Je suis pas sur que cela puisse marcher et surtout que le compilateur ne m'enguirlande pas à faire des fonction templates virtuelle pure(je vais tester)
EDIT : Bah oui, un template ne peut pas être virtuel ...![]()
Partager