 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
amerio Guest
|
Posted: Fri Jun 27, 2003 9:22 am Post subject: Re: template vers soi-meme ? |
|
|
| Quote: | Bonjour, je n'arrive pas a faire une classe ayant un template sur
elle-meme. Je m'explique : J'ai besoin de faire une classe Tactic
templatisé par TBot: template <class TBot> class Tactic
{
// Cette classe a une methode Get qui renvoit un membre de type
TBot TBot* GetBot() { return m_pTBot; }
TBot* m_pTBot;
};
Maintenant, une autre classe conteneur Bot, contenant des Tactic :
class Bot
{
Tactic* m_pTactic;
Ici, tu dois mettre la classe du template.
Mais je ne suis pas sûr que le template soit la meilleure solution
ici... Pourquoi ne pas définir une classe de base BaseBot abstraite
pour tous les Bots. Pareil pour les tactics. Ensuite, tu te sers du
polymorphisme pour avoir un pointeur vers un Bot dans ta classe
Tactic (et inversement). Le template ne me paraît pas très utile
simple pour ton cas du pointeur... Surtout que ça figera les types,
ce qui ne sera pas très pratique si ton bot veut changer de tactique
au cours du jeu (j'imagine que c'est pour un jeu ). Le template,
ici, c'est un peu le marteau pour écraser une mouche, surtout que ça
ne semble pas marcher :)
En fait, Bot et Tactic sont les classes de bases ! Les vrais bot et
tactiques en derivent (MyBot et MyTactic....)
J'ai besoin du template pour le GetBot, car je veux recuperer le vrai
type du Bot et non pas la classe de base. Pourquoi ? simplement pour
eviter un cast :
Si MyBot a une methode Jump, je veux que MyTactic puisse appeler
GetBot()->Jump() directement, sans cast !
Mon bot doit bien sur pouvoir changer de tactique (MyTactic1,
MyTactic2) mais toutes doivent etre parametrer par MyBot.
C'est pour ca que Bot ne doit contenir que des pointeurs vers des
Tactic generique, car a priori on ne sait rien dessus (par principe)
Oui, mais pour que ta tactique puisse appeler Jump(), il faut qu'elle sach
e
que Jump existe dans ton bot. Or, tu ne peux écrire un appel à Jump() que
si
tu es certain que ton template contiendra Jump() ! Ca limite donc le
template, et tu seras donc réduit à faire une arborescence... A ce
moment-là, autant utiliser un classe de base abstraite où 'void Jump () =
0;', que tu redéfinis dans ton MyBot. Ensuite, myTactic pourra appeler
Jump
sur un pointeur vers la classe base (qui pourra être n'importe quelle
classe
dérivée de la classe abstraite de base).
Disons que si j'ai bien compris ton problème, c'est le polymorphisme qu'il
te faut. Sinon, essaie de me réexpliquer
|
non, c'est pas du polymorphisme. Ce serait le cas si tout mes Bot pouvait
sautés.
Tout ce que je voulais, c'est eviter un cast. Pas faire du virtuel pur (qui
grossirait ma classe
de base, en mettant dedans tout ce que tous mes bots possibles et futurs
pourrait faire)
Tant pis, je retourne a mes cast....
Merci qd meme
|
|
| Back to top |
|
 |
Cedric V. Guest
|
Posted: Fri Jun 27, 2003 9:36 am Post subject: Re: template vers soi-meme ? |
|
|
amerio wrote:
| Quote: | non, c'est pas du polymorphisme. Ce serait le cas si tout mes Bot pouvait
sautés.
Tout ce que je voulais, c'est eviter un cast. Pas faire du virtuel pur (qui
grossirait ma classe
de base, en mettant dedans tout ce que tous mes bots possibles et futurs
pourrait faire)
Tant pis, je retourne a mes cast....
|
pourquoi ne pas passer via une Interface ?
-- CV
|
|
| Back to top |
|
 |
amerio Guest
|
Posted: Fri Jun 27, 2003 10:13 am Post subject: Re: template vers soi-meme ? |
|
|
| Quote: | non, c'est pas du polymorphisme. Ce serait le cas si tout mes Bot
pouvait
sautés.
Tout ce que je voulais, c'est eviter un cast. Pas faire du virtuel pur
(qui
grossirait ma classe
de base, en mettant dedans tout ce que tous mes bots possibles et futurs
pourrait faire)
Tant pis, je retourne a mes cast....
pourquoi ne pas passer via une Interface ?
|
cad ? que des virtuels purs ? Ca m'enpechera pas de caster. Ou alors j'ai
pas compris.
Un exemple ?
|
|
| Back to top |
|
 |
Cedric V. Guest
|
Posted: Fri Jun 27, 2003 10:59 am Post subject: Re: template vers soi-meme ? |
|
|
Cedric V. wrote:
| Quote: | int HelloWorld::print ( ) {
cout << "UNDEFINED";
}
int HelloWorld_en::print ( ) {
cout << "Hello world!";
}
int HelloWorld_fr::print ( ) {
cout << "Bonjour monde!";
}
|
oups... il faut bien sur remplacer les int par des void )
|
|
| Back to top |
|
 |
amerio Guest
|
Posted: Fri Jun 27, 2003 1:06 pm Post subject: Re: template vers soi-meme ? |
|
|
| Quote: | [snip]
Hem, oui, je sais ce qu'est l'abstraction/polymorphisme/heritage/virtuel... |
Mais là n'est pas mon pb.
Voila ce que je voudrais faire (PSEUDO-CODE!)
class Bot
{
Tactic *m_pTactic;
}
template <class B>
class Tactic
{
virtual void Apply() = 0;
B* GetBot() { return m_pB;}
B* m_pB;
}
class MyBot : public Bot;
{
MyBot() { m_pTactic = new MyTactic; }
void Jump() {....}; // n'est pas virtuel, n'existe pas dans
Bot
}
class MyTactic : public Tactic<MyBot>
{
virtual void Apply() { GetBot()->Jump(); } // je veux eviter de
faire ((MyBot*)GetBot())->Jump()
}
|
|
| Back to top |
|
 |
Christophe Lephay Guest
|
Posted: Fri Jun 27, 2003 6:30 pm Post subject: Re: template vers soi-meme ? |
|
|
"amerio" <nospamthanks_amerio (AT) hotmail (DOT) com.invalid> a écrit dans le message
de news:3efc40a1$0$11663$626a54ce (AT) news (DOT) free.fr...
| Quote: | Voila ce que je voudrais faire (PSEUDO-CODE!)
class Bot
{
Tactic *m_pTactic;
}
template <class B
class Tactic
{
virtual void Apply() = 0;
B* GetBot() { return m_pB;}
B* m_pB;
}
class MyBot : public Bot;
{
MyBot() { m_pTactic = new MyTactic; }
void Jump() {....}; // n'est pas virtuel, n'existe pas dans
Bot
}
class MyTactic : public Tactic
{
virtual void Apply() { GetBot()->Jump(); } // je veux eviter de
faire ((MyBot*)GetBot())->Jump()
}
|
Pourquoi ne pas mettre les actions des différents bots dans une hiérarchie
de foncteurs au lieu d'en faire des fonctions membres ? Par ailleurs, si tu
as besoin d'avoir des types distincts pour tes bots (selon ce qu'ils sont
capables de faire), tu peux fournir l'action en question en paramètre
template.
class action
{
public:
virtual void operator() = 0;
virtual ~action() {}
};
class jumper : public action
{
void jump();
public:
void operator() { jump(); }
};
class bot
{
action * the_action;
public:
bot( action * some_action ) : the_action( some_action ) {}
void apply() { (*the_action)(); }
virtual ~bot() {}
};
template< class A >
class mybot : public bot
{
public:
bot( A * some_action ) : bot( some_action ) {}
};
Chris
PS : en lisant le dernier fil initié par Michael, tu devrais également y
trouver des éléments de réponse
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|