Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1774 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 



 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5
Page Précédente
Auteur Sujet :

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

n°1313942
ParadoX
Posté le 26-02-2006 à 22:56:07  profilanswer
 


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
mood
Publicité
Posté le 26-02-2006 à 22:56:07  profilanswer
 

n°1313946
Joel F
Real men use unique_ptr
Posté le 26-02-2006 à 23:08:56  profilanswer
 

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

n°1313947
chrisbk
-
Posté le 26-02-2006 à 23:14:10  profilanswer
 

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

n°1313949
ParadoX
Posté le 26-02-2006 à 23:18:56  profilanswer
 


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
n°1313950
chrisbk
-
Posté le 26-02-2006 à 23:20:49  profilanswer
 

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

n°1313954
ParadoX
Posté le 26-02-2006 à 23:38:01  profilanswer
 

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
n°1313955
skelter
Posté le 26-02-2006 à 23:48:34  profilanswer
 

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

n°1313957
ParadoX
Posté le 26-02-2006 à 23:53:45  profilanswer
 


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
n°1313959
chrisbk
-
Posté le 26-02-2006 à 23:56:08  profilanswer
 

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

n°1313961
skelter
Posté le 26-02-2006 à 23:57:01  profilanswer
 

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
mood
Publicité
Posté le 26-02-2006 à 23:57:01  profilanswer
 

n°1313966
ParadoX
Posté le 27-02-2006 à 00:01:11  profilanswer
 

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
n°1313968
chrisbk
-
Posté le 27-02-2006 à 00:04:02  profilanswer
 

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

n°1313969
ParadoX
Posté le 27-02-2006 à 00:06:11  profilanswer
 

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
n°1313970
chrisbk
-
Posté le 27-02-2006 à 00:08:19  profilanswer
 

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

n°1313971
ParadoX
Posté le 27-02-2006 à 00:09:03  profilanswer
 

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


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°1313972
chrisbk
-
Posté le 27-02-2006 à 00:10:16  profilanswer
 

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

n°1313973
skelter
Posté le 27-02-2006 à 00:12:13  profilanswer
 

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

n°1313974
ParadoX
Posté le 27-02-2006 à 00:15:39  profilanswer
 

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
n°1313975
chrisbk
-
Posté le 27-02-2006 à 00:16:02  profilanswer
 

fait voir la def de Objet ?

n°1313976
chrisbk
-
Posté le 27-02-2006 à 00:16:47  profilanswer
 

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

n°1313977
ParadoX
Posté le 27-02-2006 à 00:16:50  profilanswer
 

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
n°1313978
chrisbk
-
Posté le 27-02-2006 à 00:17:33  profilanswer
 

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

n°1313979
ParadoX
Posté le 27-02-2006 à 00:18:06  profilanswer
 

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
n°1313980
chrisbk
-
Posté le 27-02-2006 à 00:18:12  profilanswer
 

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.     };

n°1313981
chrisbk
-
Posté le 27-02-2006 à 00:18:42  profilanswer
 

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]

n°1313982
ParadoX
Posté le 27-02-2006 à 00:19:12  profilanswer
 

ça change quoi, techniquement ? :sweat:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°1313983
chrisbk
-
Posté le 27-02-2006 à 00:20:07  profilanswer
 

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 ?

n°1313984
skelter
Posté le 27-02-2006 à 00:21:11  profilanswer
 

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

n°1313985
chrisbk
-
Posté le 27-02-2006 à 00:21:49  profilanswer
 

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]

n°1313986
ParadoX
Posté le 27-02-2006 à 00:22:33  profilanswer
 

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
n°1313987
chrisbk
-
Posté le 27-02-2006 à 00:24:03  profilanswer
 

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 ...


 
 

n°1313988
skelter
Posté le 27-02-2006 à 00:24:30  profilanswer
 

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
n°1313989
chrisbk
-
Posté le 27-02-2006 à 00:25:16  profilanswer
 

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]

n°1313990
skelter
Posté le 27-02-2006 à 00:26:04  profilanswer
 

ouai, les char * c'est magique

Message cité 1 fois
Message édité par skelter le 27-02-2006 à 00:26:24
n°1313991
chrisbk
-
Posté le 27-02-2006 à 00:26:58  profilanswer
 

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 !

n°1313992
ParadoX
Posté le 27-02-2006 à 00:27:09  profilanswer
 

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
n°1313993
chrisbk
-
Posté le 27-02-2006 à 00:28:46  profilanswer
 

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 &

n°1313996
ParadoX
Posté le 27-02-2006 à 00:34:52  profilanswer
 

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
n°1314013
slash33
Posté le 27-02-2006 à 08:50:44  profilanswer
 

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

n°1314050
ParadoX
Posté le 27-02-2006 à 09:57:06  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
ereg et donnée type coordonnées[debutant C++] [Urgent] Tableau 2D nombre de colonne inconnu
[débutant] char* + char* = concaténertester l'existence d'une réalisation d'une méthode 'pure virtual'
le type autoincremente sous sql 2000server????[URGENT] [C++ débutant] problème avec tableau a plusieurs dimensions
type date et autoincrementer ss sql server 2000[VBScript] tester un CRC d'un fichier VBS éxécuté
[!PERL] recuperation de données (pour débutant)[C++ débutant] Différence entre un New et un "Type nom" ?
Plus de sujets relatifs à : [C++ débutant] Tester si un Objet est d'un type précis ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR