C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Re: template vers soi-meme ?

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
amerio
Guest





PostPosted: Fri Jun 27, 2003 9:22 am    Post subject: Re: template vers soi-meme ? Reply with quote



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 Smile ). 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 Wink

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





PostPosted: Fri Jun 27, 2003 9:36 am    Post subject: Re: template vers soi-meme ? Reply with quote



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





PostPosted: Fri Jun 27, 2003 10:13 am    Post subject: Re: template vers soi-meme ? Reply with quote



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





PostPosted: Fri Jun 27, 2003 10:59 am    Post subject: Re: template vers soi-meme ? Reply with quote

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 Surprised)


Back to top
amerio
Guest





PostPosted: Fri Jun 27, 2003 1:06 pm    Post subject: Re: template vers soi-meme ? Reply with quote

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





PostPosted: Fri Jun 27, 2003 6:30 pm    Post subject: Re: template vers soi-meme ? Reply with quote

"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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.