test d'appartenance a une classe? (C++) - Programmation
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.
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
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!!!
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().
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.
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"
Marsh Posté le 26-07-2001 à 16:57:32
Je vais repondre la meme chose que youdontcare : vraiment genial!!!
Encore merci pour l'aide!!!
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";
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 ?
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
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...
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!!!
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]
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.
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]
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
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).
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
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++?