[C++ débutant] Tester si un Objet est d'un type précis ?

Tester si un Objet est d'un type précis ? [C++ débutant] - C++ - Programmation

Marsh Posté le 26-02-2006 à 22:56:07    


Bonjour,
 
Toujours dans le cadre de ce projet C++ pour la fac, je rebloque :D
 
J'ai besoin de déterminer de quel "type" un objet est ... en gros, j'ai ceci
 
Class Objet
Classe Forme : public Objet
Class Groupe : public Objet
 
Maintenant, j'ai un objet en paramètre, et dans un If je voudrais tester s'il s'agit d'un Groupe ou d'une Forme. Y-a-t'il une solution plus pratique que d'ajouter une donnée membre dans la classe Objet qui indiquerait le type ?
 
Merci :jap:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 26-02-2006 à 22:56:07   

Reply

Marsh Posté le 26-02-2006 à 23:08:56    

RTTI mais c'est moche.
Pourquoi as tu besoin de tester ? Le polymorphisme ne subvient il pas a tes besoin ?

Reply

Marsh Posté le 26-02-2006 à 23:14:10    

meme reponse que joel : c'est possible, mais tu devrais pouvoir t'en passer. C'est que ton design boite quelque part

Reply

Marsh Posté le 26-02-2006 à 23:18:56    


J'ai une liste d'objets, et ces objets peuvent etre soit des Formes soit des Groupes (de formes). Mon print() fait ça pour le moment:
 
Liste (4 elements):
<=> Triangle
<=> Carré
<=> GROUPE 1
<=> GROUPE 2
 
Et maintentnant, j'aimerais, quand un groupe est présent, faire afficher en plus le contenu de ce groupe, genre comme ça
 
 
Liste (4 elements):
<=> Triangle
<=> Carré
<=> GROUPE 1 (Parallelogramme, Rond)
<=> GROUPE 2 (Carre2, Triangle2, Parallelogramme2)
 
Et alors j'ai besoin de faire la différence entre un maillon de type Groupe et un maillon de type Forme.
 
Le print, si ça peut vous aider:
 

Code :
  1. // Affichage de la liste en mode texte
  2. void Liste::print() const
  3. {
  4. if(!estVide())
  5. {
  6.  Iterateur monIterateur(*this);
  7.  cout << "Liste (" << nbElements << " elements) : " << endl << " <=> ";
  8.  while(!monIterateur.finDeListe())
  9.  {
  10.   cout << monIterateur.valeur().nom << endl << " <=> ";
  11.   monIterateur.avance();
  12.  }
  13.  cout << "\n\n";
  14. }
  15. else
  16. {
  17.  cout << "La liste est Vide ! \n";
  18. }
  19. }


 
Il peut y avoir autant de groupes imbriqués que l'on veut !


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 26-02-2006 à 23:20:49    

bin ouais, erreur de design. Tu dois appeler objet::print(), fonction virtuelle qui sera redefinie dans chaque sous classe, pas faire l'affichage dans liste

Reply

Marsh Posté le 26-02-2006 à 23:38:01    

Joel F a écrit :

RTTI mais c'est moche.
Pourquoi as tu besoin de tester ? Le polymorphisme ne subvient il pas a tes besoin ?


 
Le typeid() me dit que tous les membres de la liste sont ... des Objets :D ça, je le savais ! Je voulais qu'il me précise s'il s'agit d'un objet FORME ou d'un objet GROUPE ! Une idée ? :/


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 26-02-2006 à 23:48:34    

ParadoX a écrit :

Le typeid() me dit que tous les membres de la liste sont ... des Objets :D ça, je le savais ! Je voulais qu'il me précise s'il s'agit d'un objet FORME ou d'un objet GROUPE ! Une idée ? :/


 
faut voir comment tu t'en sert et si tes objets sont réellement polymorphiques (j'en doute), fais comme on t'a dis car la tu n'a absolument pas besoin de ca

Reply

Marsh Posté le 26-02-2006 à 23:53:45    


Je ne comprends pas ce que vous voulez dire avec "Polymorphiques" :/
Je m'en sers comme ds les exemples que j'ai trouvés sur le net, mais d'après leurs exemples ça devrait fonctionner ... et pas chez moi :D
 
Genre ici:
http://www.cppfrance.com/code.aspx?ID=35631
 
J'ai bien moi aussi ma classe mère Objet, puis Forme et Groupe qui héritent d'Objet.  
Je vais tenter autrement, mais c'est dommage, j'aurais bien voulu savoir pourquoi ça coince :/


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 26-02-2006 à 23:56:08    

reposte le code de ta classe liste ?
 
Sinon ta methode est de toute facon pas bonne : si tu rajoutes une nouvelle forme (genre ellipse...) fodra aller modifier la classe liste pour que ca fonctionne tjs : ca n'a pas de sens

Reply

Marsh Posté le 26-02-2006 à 23:57:01    

ParadoX a écrit :

Je ne comprends pas ce que vous voulez dire avec "Polymorphiques" :/
Je m'en sers comme ds les exemples que j'ai trouvés sur le net, mais d'après leurs exemples ça devrait fonctionner ... et pas chez moi :D
 
Genre ici:
http://www.cppfrance.com/code.aspx?ID=35631
 
J'ai bien moi aussi ma classe mère Objet, puis Forme et Groupe qui héritent d'Objet.  
Je vais tenter autrement, mais c'est dommage, j'aurais bien voulu savoir pourquoi ça coince :/


 
 
faudrait qu'il y ai au moins une méthode virtuelle dans la classe mere pour qu'elle soit polymorphique


Message édité par skelter le 26-02-2006 à 23:57:25
Reply

Marsh Posté le 26-02-2006 à 23:57:01   

Reply

Marsh Posté le 27-02-2006 à 00:01:11    

chrisbk a écrit :


Sinon ta methode est de toute facon pas bonne : si tu rajoutes une nouvelle forme (genre ellipse...) fodra aller modifier la classe liste pour que ca fonctionne tjs : ca n'a pas de sens


 
Bah non ^^ Une Ellipse serait une Forme particulière !
 

Citation :

reposte le code de ta classe liste ?


 
 

Code :
  1. class Liste
  2. {
  3. friend class Iterateur;
  4. friend class Iterateur_w;
  5. private:
  6.  //Noeud de la liste
  7.  class Node
  8.  {
  9.   friend class Objet;
  10.   friend class Iterateur;
  11.   friend class Iterateur_w;
  12.   friend class Liste;
  13.   public:
  14.    Node();
  15.    Node(Objet maValeur);
  16.    Node(Objet maValeur, Node *suivant, Node *precedent);
  17.    ~Node();
  18.    
  19.   private:
  20.    Objet valeur;
  21.    Node *suivant;
  22.    Node *precedent;
  23.  };
  24.  Node *tete;
  25.  Node *queue;
  26.  int nbElements;
  27. public:
  28.  Liste();
  29.  Liste(const Liste& );
  30.  ~Liste();
  31.  void print() const;
  32.  int getNbElements() const;
  33.  void incNbElements();
  34.  void decNbElements();
  35.  bool estVide() const;
  36.  void vider();
  37.  void ajoutFin(Objet& );
  38.  void ajoutTete(Objet& );
  39.  void supprimerTete();
  40.  void supprimerQueue();
  41.  Objet valeurTete() const;
  42.  Objet valeurQueue() const;
  43.  int estPresent(char*) const;
  44.  bool supprimer(Objet& );
  45.  bool supprimer(char *);
  46. };


 
M'enfin pkoi tu veux ça ? ^^


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 27-02-2006 à 00:04:02    

parce que dans tes Noeuds tu stocke un "Objet", ton polymorphisme on dirait bien qu'il passe a la trappe

Reply

Marsh Posté le 27-02-2006 à 00:06:11    

Mais je suis bien obligé de faire une Liste générique, sinon je ne pourrais pas mélanger Formes et Groupes !


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 27-02-2006 à 00:08:19    

c'est balaise le C++ hein ? :d
 
Faudrait que tu stockes des Objets * pour que le monde soit content. Dure la vie...

Reply

Marsh Posté le 27-02-2006 à 00:09:03    

Zetes chiants [:ddr555]  
 
Merci, jy replonge :sweat:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 27-02-2006 à 00:10:16    

je sens qu'on a pas fini de la bouffer, ste liste [:petrus75]
 

Reply

Marsh Posté le 27-02-2006 à 00:12:13    

moi je comprends pas comment ca pouvais marcher ?
 
Liste (4 elements):
<=> Triangle
<=> Carré
<=> GROUPE 1 (Parallelogramme, Rond)
<=> GROUPE 2 (Carre2, Triangle2, Parallelogramme2)

Reply

Marsh Posté le 27-02-2006 à 00:15:39    

skelter a écrit :

moi je comprends pas comment ca pouvais marcher ?
 
Liste (4 elements):
<=> Triangle
<=> Carré
<=> GROUPE 1 (Parallelogramme, Rond)
<=> GROUPE 2 (Carre2, Triangle2, Parallelogramme2)


 
J'aurais, pour chaque element ( chez moi donc monIterateur.valeur()), testé s'il s'agit d'un groupe ou d'une forme. Si c'est une forme, je laisse comme c'est actuellement (monIterateur.valeur().nom) ... et s'il s'agit d'un groupe, j'aurais fait un print récursiv sur ce groupe. Jsuis clair ? :sweat:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 27-02-2006 à 00:16:02    

fait voir la def de Objet ?

Reply

Marsh Posté le 27-02-2006 à 00:16:47    

ParadoX a écrit :

Jsuis clair ? :sweat:


 
ué. ce qui est surtout clair c'est que tu fais du boulot pas du tout au bon endroit. C'est pas a la liste de savoir comment afficher un objet, mais a un objet de s'avoir s'afficher

Reply

Marsh Posté le 27-02-2006 à 00:16:50    

chrisbk a écrit :

fait voir la def de Objet ?


 

Code :
  1. //"Super-classe" Objet, qui est l'élément de base du projet
  2. class Objet
  3. {
  4. friend class Liste;
  5. friend class Groupe;
  6. friend class Iterateur_w;
  7. private:
  8.  char *nom;
  9.  bool estLibre;
  10. public:
  11.  Objet();
  12.  Objet(char *nom);
  13.  ~Objet();
  14.  void printNom() const;
  15. };


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 27-02-2006 à 00:17:33    

gru §§
 
char * pour chaine de caractere : NO §§§
 
std::string
 

Reply

Marsh Posté le 27-02-2006 à 00:18:06    

chrisbk a écrit :

gru §§
 
char * pour chaine de caractere : NO §§§
 
std::string


 
ça, c'était parce qu'on avait pas droit à la classe String, remember ? [:ddr555]
Et puis ça à quoi de pas catholique ? :o ça marche très bien :o

Message cité 1 fois
Message édité par ParadoX le 27-02-2006 à 00:18:28

---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 27-02-2006 à 00:18:12    

Code :
  1. class Objet
  2.     {
  3.         friend class Liste;
  4.         friend class Groupe;
  5.         friend class Iterateur_w;
  6.    
  7.         private:       
  8.             std::string nom;
  9.             bool estLibre;
  10.    
  11.         public:
  12.             Objet();
  13.             Objet(const std::string &nom);
  14.             ~Objet();
  15.             void printNom() const;
  16.    
  17.     };

Reply

Marsh Posté le 27-02-2006 à 00:18:42    

ParadoX a écrit :

ça, c'était parce qu'on avait pas droit à la classe String, remember ? [:ddr555]
Et puis ça à quoi de pas catholique ? :o ça marche très bien :o


 
[:pingouino] mais nan quoi [:pingouino]

Reply

Marsh Posté le 27-02-2006 à 00:19:12    

ça change quoi, techniquement ? :sweat:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 27-02-2006 à 00:20:07    

ParadoX a écrit :

ça change quoi, techniquement ? :sweat:


 
plein, beaucoup. char *, c'est une machination de satan. tu fais une copie de la chaine dans ta classe ou tu te contente de stocker lepointeur que tu recois ?

Reply

Marsh Posté le 27-02-2006 à 00:21:11    

ParadoX a écrit :

ça change quoi, techniquement ? :sweat:


 
 
ben ta classe est buggée car tu n'a pas rédéfini de comportement pour la copie

Reply

Marsh Posté le 27-02-2006 à 00:21:49    

skelter a écrit :

ben ta classe est buggée car tu n'a pas rédéfini de comportement pour la copie


 
ah ouais, en plus, j'avais meme pas fait gaffe [:pingouino]

Reply

Marsh Posté le 27-02-2006 à 00:22:33    

Code :
  1. //Constructeur par défaut
  2. Objet::Objet()
  3. {
  4. this->nom = "";
  5. this->estLibre = true;
  6. }
  7. //Constructeur complet
  8. Objet::Objet(char *nomdonne)
  9. {
  10. this->nom = nomdonne;
  11. this->estLibre = true;
  12. }


 
C'est ça que vous voulez savoir ?  :sweat:  
Vous me parlez en chinois, actuellement  :sweat:  
 
N'oubliez pas que je débute [:thalis]


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 27-02-2006 à 00:24:03    

ParadoX a écrit :

Code :
  1. //Constructeur par défaut
  2. Objet::Objet()
  3. {
  4. this->nom = "";
  5. this->estLibre = true;
  6. }
  7. //Constructeur complet
  8. Objet::Objet(char *nomdonne)
  9. {
  10. this->nom = nomdonne;
  11. this->estLibre = true;
  12. }


 
C'est ça que vous voulez savoir ?  :sweat:  
Vous me parlez en chinois, actuellement  :sweat:  
 
N'oubliez pas que je débute [:thalis]


 
ouais, donc ca, c'est satan
 
exemple rigolo
 

Code :
  1. char * bidule = strdup("lalaloyogo" );
  2. Objet machin(bidule);
  3. free(bidule);
  4. //Ici machin continue a stocker un pointeur vers un truc qui pointe plus vers rien. Emmerde en vue, capitaine ...


 
 

Reply

Marsh Posté le 27-02-2006 à 00:24:30    

ParadoX a écrit :

Code :
  1. //Constructeur par défaut
  2. Objet::Objet()
  3. {
  4. this->nom = "";
  5. this->estLibre = true;
  6. }
  7. //Constructeur complet
  8. Objet::Objet(char *nomdonne)
  9. {
  10. this->nom = nomdonne;
  11. this->estLibre = true;
  12. }


 
C'est ça que vous voulez savoir ?  :sweat:  
Vous me parlez en chinois, actuellement  :sweat:  
 
N'oubliez pas que je débute [:thalis]


 
de mieux en mieux, serieux utilises std::string, ton prof il avais qu'a vous expliquer tout ca

Message cité 1 fois
Message édité par skelter le 27-02-2006 à 00:25:06
Reply

Marsh Posté le 27-02-2006 à 00:25:16    

skelter a écrit :

de mieux en mieux, serieux utilises std::string, ton prof il avais qu'a vous expliquer tout ca


 
bin le prof il a pas exactement l'air au top [:pingouino]

Reply

Marsh Posté le 27-02-2006 à 00:26:04    

ouai, les char * c'est magique

Message cité 1 fois
Message édité par skelter le 27-02-2006 à 00:26:24
Reply

Marsh Posté le 27-02-2006 à 00:26:58    

skelter a écrit :

les char * c'est magique


 
-Bonjour, je veux un programme qui leaks plein pot et qui risque de planter sur des conneries, vous avez une solution a me proposer ?
-char * !
-merci !

Reply

Marsh Posté le 27-02-2006 à 00:27:09    

Hm on m'a toujours appris comme ça (en cours de C systeme :D), et la c'était le seul moyen que je voyais sans utiliser String.  
M'enfin si c'est si dangereux, pourquoi ma Liste marche sans problèmes avec tous les objets, et tout ? ^^
 
Pour corriger, il faudrait que je passe en String ? Rien d'autre à faire avec char ?


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 27-02-2006 à 00:28:46    

ParadoX a écrit :

Hm on m'a toujours appris comme ça (en cours de C systeme :D), et la c'était le seul moyen que je voyais sans utiliser String.  
M'enfin si c'est si dangereux, pourquoi ma Liste marche sans problèmes avec tous les objets, et tout ? ^^


 
parce que c'est dangeureux. Pas forcement fatal. Sur tes 19lignes de code, ca va, mais sur un truc plus gros tu risques gros (sauf si vraiment tu sais ce que tu fais). Donc plutot que de se faire chier on utilise std::string, ce qui evite pas mal de crise de nerfs
 

ParadoX a écrit :


Pour corriger, il faudrait que je passe en String ? Rien d'autre à faire avec char ?


 
Tes variables membre deviennet std::string
et quand en parametre de fonctions tu prenait avant un char * maintenant tu prends un const std::string &

Reply

Marsh Posté le 27-02-2006 à 00:34:52    

Merci !
 
J'ai mailé mon prof en précisant ton exemple (:D), et je lui ai demandé pour les Strings. Bref, fini pour ce soir, demain, je continue à vous embêter [:itm]
 
 :jap:  :hello:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 27-02-2006 à 08:50:44    

chrisbk a écrit :

ué. ce qui est surtout clair c'est que tu fais du boulot pas du tout au bon endroit. C'est pas a la liste de savoir comment afficher un objet, mais a un objet de s'avoir s'afficher


Et si on inverse les dépendances pour que l'objet ne gère pas lui même son affichage (après tout, l'affichage est une fonction informatique et non un objet métier) ?
 
Peut-on associer un objet "renderer" responsable de l'affichage de l'objet ? Chaque renderer traitera un objet ou un famille d'objet (ex: carré, rectangle, losange... sont des parallelogrammes).

Reply

Marsh Posté le 27-02-2006 à 09:57:06    

La réponse du prof:
 

Citation :

Bonjour,
 
Les rumeurs... Je maintiens le même discours que lorsque j'ai donné le
projet: seule la librairie standard C <string.h> est autorisée (standard C
veut bien dire ce que cela veut dire). Seules les fonctions C sont
utilisables mais par la classe string.
 

Citation :

// Début du Code
    char * bidule = strdup("lalaloyogo" );
    Objet machin(bidule);
    free(bidule);    
    //Ici machin continue a stocker un pointeur vers un truc qui pointe plus
vers rien. Emmerde en vue, capitaine ...
 
// Fin du Code


 
Pour ce code tout dépend ce que vous faites dans le constructeur:
personnellement dans le constructeur d'Objet je dupliquerais l'info bidule
donc cela ne serait pas dangereux. Mais cela dépend des cas, parfois c'est
bien de dupliquer mais parfois non (perte de vitesse). Aussi veillez à bien
documenter vos méthodes pour que l'appelant sache s'il peut libérer ou non
après l'appel.
 
Cordialement,


 
Bref, jremets mes char *, ou jpeux faire quoi avec le String.h ? :sweat:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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