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

  FORUM HardWare.fr
  Programmation

  test d'appartenance a une classe? (C++)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

test d'appartenance a une classe? (C++)

n°49087
sebmarley
Posté le 26-07-2001 à 15:37:53  profilanswer
 

Bonjour!!
voila le pb : j'ai un pointeur initialise sur une classe mere qui pointe sur une de ses classes filles en fonction des besoins. Dans une autre partie du programme, j'ai ce pointeur et j'ai besoin de savoir sur quel type de classe fille il pointe exactement. Est-ce qu'il existe un moyen de tester ca en C++?

mood
Publicité
Posté le 26-07-2001 à 15:37:53  profilanswer
 

n°49094
Guz
Posté le 26-07-2001 à 16:05:19  profilanswer
 

Salut y'a deux facons de faire.
 
La soluce que j'aime beaucoup si tu est sous Windows et que tu utilise les MFC tu fais deriver la classe de base de tes filles de la classe CObject et tu rajoutes les deux macros DECLARE_DYNAMIC et IMPLEMENT_DYNAMIC grace a ca tu pouuras utiliser IsKindOf( xxxx ) avec tes pointeurs.
 
Sinon tu rajoute un membre dans ta classe mere que tu initialise diffrement dans chacune des classes filles et tu testes ce membre.
 
Voila.

n°49097
seblamb
Posté le 26-07-2001 à 16:12:50  profilanswer
 

Plus portable : typeid
 
void main() {
   char C;
   float X;
 
   // UTILISEZ typeinfo::operator==()POUR FAIRE LA COMPARAISON
   if (typeid( C ) == typeid( X ))
      cout << "C et X sont de même type." << endl;
   else cout << "C et X ne sont PAS de même type." << endl;
 
   // UTILISEZ LES LITTERAUX true ET false POUR FAIRE LA COMPARAISON
   cout << typeid(int).name();
   cout << " avant " << typeid(double).name() << ": " <<
 
        (typeid(int).before(typeid(double)) ? true : false) << endl;
   cout << typeid(double).name();
 
   cout << " avant " << typeid(int).name() << ": " <<
        (typeid(double).before(typeid(int)) ? true : false) << endl;
 
   cout << typeid(A).name();
   cout << " avant " << typeid(B).name() << ": " <<
        (typeid(A).before(typeid(B)) ? true : false) << endl;
 
   }
 
Sortie du programme
 
C et X ne sont PAS de même type.
 
int avant double: 0
double avant int: 1
 
A avant B: 1


---------------
[:seblamb] Moi aussi je veux grater dédé!!!
n°49103
sebmarley
Posté le 26-07-2001 à 16:23:30  profilanswer
 

Merci pour vos reponses!!
Guz -> desole mais je suis sous linux :(
seblamb -> je vais essayer tout de suite!!!

n°49109
sebmarley
Posté le 26-07-2001 à 16:40:41  profilanswer
 

Euh... c'est dans une librairie speciale? parce que j'ai pris un bout de ton programme pour tester et il me marque :
no matching function for call to `type_info::name () const'
pour un appel a typeid(int).name().

n°49112
seblamb
Posté le 26-07-2001 à 16:46:11  profilanswer
 

Je sais pas comment ont fait avec gcc, mais il faut suivant les compilateur activer les RTTI qui sont déactivée par défaut .
Il faut aussi que le compilteur le supporte.


---------------
[:seblamb] Moi aussi je veux grater dédé!!!
n°49114
youdontcar​e
Posté le 26-07-2001 à 16:51:55  profilanswer
 

seblamb > absolument géniale cette fonction ! si tu as d'autres trucs du même style, je suis preneur ! :) ça ne marche que si la rtti est activée ?
 
sebmarley > include "typeinfo.h"

n°49117
sebmarley
Posté le 26-07-2001 à 16:57:32  profilanswer
 

Je vais repondre la meme chose que youdontcare : vraiment genial!!!  
Encore merci pour l'aide!!!

n°49119
seblamb
Posté le 26-07-2001 à 17:00:05  profilanswer
 

Dans le style il y a dynamic_cast
qui permet de convertir un type dans sa classe dérivée.
example :
 
 class A {...};
 class B : public A {...};
   
 A *a;
 B *b;
   
 a = new B;
 b = dynamic_cast<B>(a);
 if ( !b)
   cout << "dynamic_cast error";


---------------
[:seblamb] Moi aussi je veux grater dédé!!!
n°49120
youdontcar​e
Posté le 26-07-2001 à 17:00:17  profilanswer
 

je cherche un peu sur google, je tombe sur des messages contradictoires "ça utilise la rtti" / "ça ne l'utilise pas".
 
j'utilise vc++, la rtti est disablée ... bizarre bizarre ... du microsoft specific à l'horizon ?

mood
Publicité
Posté le 26-07-2001 à 17:00:17  profilanswer
 

n°49139
JoeHell
mais non ca va marcher ....
Posté le 26-07-2001 à 17:55:08  profilanswer
 

et oui car Micro$oft a jugée bon d'encapsulé la RTTI dans son API et sa MFC
Le truc est que leur IsKindOf n'est ni + ni - qu'une encapsulation de typeid et typeinfo
 
sinon pr du C++ standard, fo activer ca ds le compilo et utiliser la STD
 
voili

n°49262
robUx4
misc coder
Posté le 27-07-2001 à 10:33:05  profilanswer
 

Ben sinon tu met cette méthode "IsUneSorteDe" en virtuelle et tu l'instancies pour chaque classe fille pour qu'elle retourne une valeur différente...

n°49287
sebmarley
Posté le 27-07-2001 à 11:44:48  profilanswer
 

Autre petite question concernant le polymorphisme em c++ :
j'ai la meme config que tout a l'heure, et quand je veux acceder aux methodes des classes filles, y'a aucun probleme vu qu'elles sont en virtual. Mais je n'arrive pas a acceder a des variables declarees dans les classes filles alors que tout est en public et que j'ai mis juste avant :  
pointeur = new Classe_Fille;
Normalement je devrais pouvoir acceder a ces variables, mais le compilateur me dit qu'il ne les connait pas (normal vu qu'il les cherche dans la classe mere)
Y'a un probleme dans mon raisonnement, ou il faut que je jette mon ordinateur par la fenetre du 3ieme etage?
 
Je vous serais eternellement reconnaissant si vous avez une solution, parce que ca fait quelques heures que j'y suis dessus!!!

n°49289
seblamb
Posté le 27-07-2001 à 11:55:30  profilanswer
 

Je suis pas sur d'avoir compris . Tu fais ça dans ton prog ? :
 
 class A { public : int i;};
 class B : public A{ public : int j;};
 
 A *a = new B;
 a->j  = 3; // Erreur de compilation

 

[edtdd]--Message édité par seblamb--[/edtdd]

n°49291
sebmarley
Posté le 27-07-2001 à 11:59:49  profilanswer
 

Exactement!!! et le compilateur me met : class ITP_Geometry' has no member named `radius
ITP_Geometry est la classe mere, ITP_Disk est la classe fille et contient un double radius, et j'ai declare juste avant que mon pointeur est un new ITP_Disk.

n°49296
seblamb
Posté le 27-07-2001 à 12:06:15  profilanswer
 

C'est normal, c'est un pointeur de type un ITP_Geometry donc il peut atteindre que  les membres de ITP_Geometry .
 
Pour pouvoir l'utiliser il faut transtyper :
 2 méthodes  
 - la sale ( comme en C )  
 
   ((ITP_Disk*)p)->radius;  
 
 - la propre version ( spécifique C++)
    p2 = dynamic_cast<ITP_Disk*>(p)  
    if( !p2)
     throw 1;
     
    p2->radius;

 

[edtdd]--Message édité par seblamb--[/edtdd]


---------------
[:seblamb] Moi aussi je veux grater dédé!!!
n°49299
sebmarley
Posté le 27-07-2001 à 12:13:33  profilanswer
 

Je m'incline devant toi et te remercie a genoux!!!  
j'etais vraiment persuade qu'on pouvait acceder directement a ces variables -> je crois que tu viens de m'economiser plusieurs heures de casse tete et de rage folle :)
Bon je vais essayer de continuer ce prog sans te deranger tous les jours ;)

n°49332
robUx4
misc coder
Posté le 27-07-2001 à 13:58:46  profilanswer
 

seblamb a écrit a écrit :

Je suis pas sur d'avoir compris . Tu fais ça dans ton prog ? :
 
 class A { public : int i;};
 class B { public : int j;};
 
 A *a = new B;
 a->j  = 3; // Erreur de compilation  




 
Ca serait pas plutôt :
class B : public A { public : int j;};
 
c'est logique que a->j n'existe pas ! Il faudrait faire (B * a)->j m'enfin c'est de la bidouille (dans l'exemple ca marche, mais c'est la porte ouverte au n'importe quoi).

n°49355
seblamb
Posté le 27-07-2001 à 15:00:49  profilanswer
 

Tu as raison j'ai corrigé, mais tout le monde avait compris ce que je voulais dire  ;)


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

  test d'appartenance a une classe? (C++)

 

Sujets relatifs
[PHP] Classe FastTemplatetest
Test d'un prog 3D ... si vous avez les 12.41WHQL ... please courrez...Test d'existence d'un SELECT en PHP4 et ORACLE8
[C++] classe statique[java] sous classe
Java: La meta classe Class[ASP] Pb de test sur un nombre négatif...
gros beta (...) test publicClasse graphe en C++ et utilisation de STL
Plus de sujets relatifs à : test d'appartenance a une classe? (C++)


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