Tu as raison j'ai corrigé, mais tout le monde avait compris ce que je voulais dire ;)
robUx4
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).
sebmarley
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 ;)
seblamb
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]
sebmarley
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.
seblamb
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]
sebmarley
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!!!
robUx4
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...
JoeHell
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
youdontcare
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 ?
seblamb
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";
sebmarley
Je vais repondre la meme chose que youdontcare : vraiment genial!!! Encore merci pour l'aide!!!
youdontcare
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"
seblamb
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.
sebmarley
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().
sebmarley
Merci pour vos reponses!!
Guz -> desole mais je suis sous linux :(
seblamb -> je vais essayer tout de suite!!!
seblamb
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() << ": " <<
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.
sebmarley
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++?