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

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

Marsh Posté le 26-07-2001 à 15:37:53    

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++?

Reply

Marsh Posté le 26-07-2001 à 15:37:53   

Reply

Marsh Posté le 26-07-2001 à 16:05:19    

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.

Reply

Marsh Posté le 26-07-2001 à 16:12:50    

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é!!!
Reply

Marsh Posté le 26-07-2001 à 16:23:30    

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

Reply

Marsh Posté le 26-07-2001 à 16:40:41    

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

Reply

Marsh Posté le 26-07-2001 à 16:46:11    

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é!!!
Reply

Marsh Posté le 26-07-2001 à 16:51:55    

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"

Reply

Marsh Posté le 26-07-2001 à 16:57:32    

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

Reply

Marsh Posté le 26-07-2001 à 17:00:05    

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é!!!
Reply

Marsh Posté le 26-07-2001 à 17:00:17    

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 ?

Reply

Marsh Posté le 26-07-2001 à 17:00:17   

Reply

Marsh Posté le 26-07-2001 à 17:55:08    

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

Reply

Marsh Posté le 27-07-2001 à 10:33:05    

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

Reply

Marsh Posté le 27-07-2001 à 11:44:48    

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

Reply

Marsh Posté le 27-07-2001 à 11:55:30    

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]

Reply

Marsh Posté le 27-07-2001 à 11:59:49    

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.

Reply

Marsh Posté le 27-07-2001 à 12:06:15    

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é!!!
Reply

Marsh Posté le 27-07-2001 à 12:13:33    

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

Reply

Marsh Posté le 27-07-2001 à 13:58:46    

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

Reply

Marsh Posté le 27-07-2001 à 15:00:49    

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

Reply

Sujets relatifs:

Leave a Replay

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