[C++] creer un objet avec une classe aleatoire ??

creer un objet avec une classe aleatoire ?? [C++] - Programmation

Marsh Posté le 26-02-2002 à 13:12:02    

Bonjour,
j'ai ecrit un programme où il y 4 classes.
On va dire A B C et D.
Dans mon main() je crée un objet en faisant :      A o1; ou encore B o1
(avec o1 pour objet1)
Ensuite je fait tout un tas d'appel a des fonctions membres:
o1.quel_cout() par exemple.
 
J'aimerais que la creation de l'objet se fasse avec une des quatres classes
mais aleatoirement.
Peut être avec un pointeur ?
 
Pouvez vous m'aider ? Merci d'avance pour vos reponses.

Reply

Marsh Posté le 26-02-2002 à 13:12:02   

Reply

Marsh Posté le 26-02-2002 à 13:15:39    

Ben il faut que les quatre classes derivent d'une classe commune.... et tu renvoies un pointeur/une reference sur la clmasse de base...
 
Quel est le but ?

Reply

Marsh Posté le 26-02-2002 à 13:19:32    

J'ai créer un classe generale et 4 classes qui en herite.
C'est un programme fenetre DOS, qui cré aleatoirement un personnage. Le fait de rendre la classe "tiré" aleatoire me permet de creer une race aleatoire.

Reply

Marsh Posté le 26-02-2002 à 13:38:57    

si ta classe mere c'est E,
 
 
E * objs[4];
 
objs[0]= new A();
objs[1]= new B();
...
 
objs[rand()%4]->quel_cout();

Reply

Marsh Posté le 26-02-2002 à 14:17:22    

Voici mon main();
 
void main(void){
 init();
 
 nain o1;  
 
 cout<<"Nom:       ";
 o1.quel_prenom();  
 o1.quel_nom1();
 o1.quel_nom2();
 
 cout<<endl<<"Race:      ";
 o1.quelle_race();
 
 cout<<endl<<"Classe:    ";
 o1.quel_metier();
 
 cout<<endl<<"Age:       ";
 o1.quel_age();
 
 cout<<"Taille:    ";
 o1.quelle_taille();
 
 cout<<endl<<"\n== caracteristiques ==\n"<<endl;
 o1.quelle_FOR();
 o1.quelle_DEX();
 o1.quelle_INT();
 o1.quelle_CON();
 o1.quelle_SAG();
 o1.quelle_CHA();
 cout<<endl;
 
};
 
 
 
el les classes.
 
class humanoide:public carac {
 
 public:
  virtual void quel_nom2();
  virtual void quel_nom1();
  virtual void quel_prenom();
  virtual void quel_age();
  virtual void quelle_race();
  virtual void quelle_taille();
  virtual void quel_metier();
};
 
class nain:public humanoide {
 
 public:
   virtual void quelle_taille();
   virtual void quel_age();
   virtual void quelle_FOR();
   virtual void quelle_SAG();
   virtual void quelle_race() const {cout<<"Nain";};
   virtual void quel_metier();
};
 
class hobbit:public humanoide {
 
 public:
   virtual void quelle_taille();
   virtual void quel_age();
   virtual void quelle_FOR();
   virtual void quelle_race() const {cout<<"Hobbit";};
   virtual void quel_metier();
};
 
 
les autres classes sont du même ordre.
Que dois je mettre dans le main à la plce de nain o1;  pour que la classe appelé soit aleatoire ?

Reply

Marsh Posté le 26-02-2002 à 17:09:02    

Perso, j'aurais fait une factory qui renvoie une reference du type de la classe mère (humanoide) vers une instance d'une des 4 classes (nain, hobbit etc...).
 
La factory est un singleton avec une méthode du style  

Code :
  1. Humanoide* FactoryPJ::CreeNouvelHumanoide() {
  2. Humanoide* instance = NULL;
  3.     switch(unD4) {
  4.     case 0 : instance = new Nain();
  5.     //etc...
  6.     }
  7. // tu peux en profiter pour abonner l'instance à toute sorte
  8. // d'evennements
  9.     return instance;
  10. }


 
Il y a peut etre une autre méthode mais celle ci permet de découpler les classes (le hobbit n'a pas à connaitre le nain etc...)


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 26-02-2002 à 17:20:01    

et il faudrait un mecanisme d'enregistrement
des classes  
pour que la classe factory n'ait pas a connaitre
qu'il y a une classe orc qui derive
de "gobelinoide".
 
Zut, ca va etre chaud a faire en C++..
 
A+
LEGREG

Reply

Marsh Posté le 26-02-2002 à 17:25:31    

arghh !
Je pensais que ça allait être "simple" :o)
Bon, je vais voir ce que je peut faire avec une factory...
 
LEGREG lis dans mon code ou quoi ?
Bien sur que Gobelinoide va se radiner :o)
Merci

Reply

Marsh Posté le 26-02-2002 à 17:49:35    

j'ai un oeil par dessus ton epaule..
 
Mais tu peux te contenter de faire simple.
ce sont juste des suggestions.
 
A+
LEGREG

Reply

Marsh Posté le 26-02-2002 à 17:56:29    

Je vais faire simple...
Je ne m'en sort pas avec factory

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed