| |
Consulter les messages sans réponse | Consulter les sujets actifs
|
Page 1 sur 1
|
[ 10 message(s) ] |
|
| Auteur |
Message |
|
cro
|
Publié: 17 Jan 2003, 15:38 |
|
Inscription : 08 Jan 2002, 14:51 Message(s) : 1337 Localisation : Québec
|
|
Je sais qu'il est possible de connaître la classe d'un pointeur avec les MFC en utilisant la méthode IsKindOf. Cette Fonctionnalitée existe t'elle en ANSI C++ ?
Merci
|
|
| Haut |
|
 |
|
Thunder
|
Publié: 17 Jan 2003, 18:54 |
|
 |
| Régulier |
 |
Inscription : 06 Jan 2002, 22:42 Message(s) : 416 Localisation : Québec
|
|
Allô !
Je ne connais pas de fonctions en ANSI C++ qui permettent de l'avoir et disons que je suis un peu contre l'idée de connaître le type de pointeur...
Avec les utilisations des interfaces j'ai pas besoin de connaître les types des pointeurs. Je déteste faire du type cast... J'aime mieux que ça soit le compilateur qui s'arrange avec ça(virtualisation des classes). Moi je fais mon appel interface->fonction() et selon le type que c'est, il va appeler la bonne fonction...
J'ai fait une recherche pour savoir comment il fonctionnait en MFC pour avoir le type de pointeur... C'est dans le CObject que ça se fait, bref dans l'univers MFC tout est un CObject, c'est pour ça que tu peux avoir des patentes comme IsKindOf.
Faut croire que je suis un puriste, car, je ne veux pas avoir besoin de telles choses pour connaître le type de pointeur, je veux simplement l'appeler et on en parle plus.
Peut-être que je ne saisis pas complètement le problème, mais, je me suis tout le temps demandé comment ça cet opérateur là existe dans le monde de MFC... Quand je dois programmer en MFC je m'arrange le plus possible pour l'éviter.
Bebye !
_________________ Thunder
The two basic principles of Windows administration: - For minor problems, reboot - For major problems, reinstall
|
|
| Haut |
|
 |
|
blacklight
|
Publié: 19 Jan 2003, 11:30 |
|
 |
| Occasionnel |
 |
Inscription : 08 Jan 2002, 22:43 Message(s) : 140 Localisation : Québec
|
En C++, il y a du "run time type identification" (RTTI); toutefois, ce n'est valide que pour les classes appartenant a la meme hierarchie. C'est un "dynamic_cast"
par exemple:
Code : A* a; B* b = dynamic_cast<B*>(a); if( b != 0 ) { // C'est un objet de type B ! }
Attention: un dynamic cast ne s'applique que pour des objets faisant partie de la meme hierarchie d'heritage. Dans l'exemple ci haut, A est une classe de base et B en herite: Code : class A { //... }; class B : public A { //... };
Si les classes n'auraient pas ete reliees par heritage; le dynamic_cast n'aurait eu aucune chance de fonctionner.
Toutefois, d'accord avec Thunder... en general, c'est pas une bonne idee d'essayer de savoir quel est le type d'un pointeur.
L'utilisation d'interfaces et de fonctions virtuelles englobe la plupart des cas communs. (Toutefois... dans certains cas, ca peut etre utile)
|
|
| Haut |
|
 |
|
Thunder
|
Publié: 19 Jan 2003, 16:12 |
|
 |
| Régulier |
 |
Inscription : 06 Jan 2002, 22:42 Message(s) : 416 Localisation : Québec
|
|
Allô !
Ce que j'aime bien dans ces forums, c'est d'apprendre l'existence de différentes méthodes pour parvenir à un point...
Je tente de savoir si le dynamic_cast est un standard ANSI ou si c'est une extension du compilateur Visual C++...
La seule utilitée que j'ai vue, c'est dans le cas que tu gardes un pointeur sur un void, mais que tu ne veux pas perdre de vue que c'est un pointeur sur un type d'objet déterminé.
Surtout qu'il faut que la ligne d'héritage soit préservée, en utilisant les interfaces le compilateur va faire le upcast de façon implicite, donc, pas besoin d'utiliser cette opérateur là.
Aussi, je m'efforce toujours d'avoir un code qui est le plus portable, donc j'évite l'utilisation de certains opérateurs avant d'être sûr qu'ils ont les mêmes comportements d'une plate-forme à l'autre.
Enfin, c'est très intéressant comme discussion, je vais tenter de trouver si dynamic_cast n'est pas un template ANSI ou quelque chose comme ça.
Mais, pour le moment j'ai rien trouvé à ce sujet-là, à part que l'opérateur existe et fait le travail, excepté que, ce n'est pas possible de trouver la déclaration de cet opérateur là.
Bebye !
_________________ Thunder
The two basic principles of Windows administration: - For minor problems, reboot - For major problems, reinstall
|
|
| Haut |
|
 |
|
Auron
|
Publié: 19 Jan 2003, 16:59 |
|
Inscription : 22 Fév 2002, 20:54 Message(s) : 738 Localisation : Montréal
|
|
| Haut |
|
 |
|
Thunder
|
Publié: 19 Jan 2003, 17:22 |
|
 |
| Régulier |
 |
Inscription : 06 Jan 2002, 22:42 Message(s) : 416 Localisation : Québec
|
|
Allô !
Merci Auron pour une réponse aussi rapide.
Je suis allé jeter un coup d'oeil à la page, il y avait de l'information que j'avais trouvé, mais j'ai pu en trouver d'autre.
Aussi, ce que je peux lire c'est une extension du C++, mais est-ce que c'est le C++ ANSI ou celui de Microsoft.
Ensuite, selon mon expérience de vouloir savoir quel est le type de pointeur ça peut ouvrir la porte à des tours de passe passe qui rendent le code plus difficile à lire/comprendre...
C'est comme de mettre du code dans un interface, en C++ tu peux le faire, mais en JAVA tu ne peux pas. Habituellement, un interface c'est la porte d'entrée pour l'utilisation de l'objet, mais l'utilisateur/programmeur n'a pas à connaitre/accéder directement le fonctionnement interne de l'objet. C'est un canevas sur le format d'entrée/sortie de l'objet.
Ce qui fait la puissance du C++ c'est la possibilité de faire à peu près n'importe quoi, mais malheureusement, c'est ce qui contribue aussi grandement à sa complexité...
Bebye !
_________________ Thunder
The two basic principles of Windows administration: - For minor problems, reboot - For major problems, reinstall
|
|
| Haut |
|
 |
|
Auron
|
Publié: 19 Jan 2003, 17:34 |
|
Inscription : 22 Fév 2002, 20:54 Message(s) : 738 Localisation : Montréal
|
|
Moi je trouve que le RTTI brise l'idée de l'orienté objet. L'objet devrait savoir ce qu'il a à faire, on ne devrait pas choisir nous même quoi faire par rapport au type d'objet. De plus si cette méthode est utilisée régulièrement dans un programme, la quantité de code à ajouter à chaque fois qu'un nouvel objet est créé sera considérable.
|
|
| Haut |
|
 |
|
Thunder
|
Publié: 19 Jan 2003, 17:53 |
|
 |
| Régulier |
 |
Inscription : 06 Jan 2002, 22:42 Message(s) : 416 Localisation : Québec
|
Allô !
Auron a écrit: Moi je trouve que le RTTI brise l'idée de l'orienté objet.
C'est ce que je reproche à cette méthode là... Quand j'ai découvert (triste découverte) que la méthode IsKindOf permettait de savoir quel était le type d'objet MFC qui était passé. Je me suis dit : "Ouch ça va être laid de voir les patchs et les switch case pousser."
Étant donné que je suis de la génération qui ont appris le procédural, je suis beaucoup plus puriste pour le développement en orienté objet.
Car la pensée procédurale est une habitude qui est longue à casser, ça demande de changer ses réflexes et sa façon de penser pour développer des outils et le reste. Aussi, j'ai pu constater tout le bordel que la pensée procédurale peut emmener et à quel point l'orienté objet peut aider à démêler tout ça.
Car, un opérateur comme IsKindOf ou tout autre types qui effectue la même chose ça aide à faire des patchs dans le code, et plus un code devient patché, plus il est difficile à comprendre et entretenir...
Bebye !
_________________ Thunder
The two basic principles of Windows administration: - For minor problems, reboot - For major problems, reinstall
|
|
| Haut |
|
 |
|
cro
|
Publié: 20 Jan 2003, 15:56 |
|
Inscription : 08 Jan 2002, 14:51 Message(s) : 1337 Localisation : Québec
|
Merci pour le RTTI ! Je suis d'accord avec vous pour dire que ce n'est pas une bonne méthode de programmation. Je reprogramme un logiciel qui utilise un peu cette méthode ex.:
Code : class Base { int nType; };
class A : public Base { A() { nType = A; } };
class B : public Base { B() { nType = B; } };
... vector<Base *> vec; if (vec.nType == A) ... if (vec.nType == B) ...
Comme ce logiciel est du pour " hier ", je dois faire vite... même TROP vite ! Il est certain que je vais essayé de revoir la structure pour qu'elle soit plus orienté objet afin d'éviter ce genre de programmation.
C'est un peu comme les Goto, c'est pas parce que ça existe qu'on doit les utiliser
Edit: code
|
|
| Haut |
|
 |
|
Thunder
|
Publié: 22 Jan 2003, 22:51 |
|
 |
| Régulier |
 |
Inscription : 06 Jan 2002, 22:42 Message(s) : 416 Localisation : Québec
|
Allô !
cro a écrit: Comme ce logiciel est du pour " hier ", je dois faire vite... même TROP vite ! Il est certain que je vais essayé de revoir la structure pour qu'elle soit plus orienté objet afin d'éviter ce genre de programmation.
Je ne me rappel pas dans quel signature j'ai lu ça, c'était dans les forums ici, mais je trouvais que c'était tellement vrai.
Nous n'avons jamais le temps de bien faire une chose, mais nous avons toujours le temps de la refaire...
C'est souvent le problème dans le domaine de la programmation... Combien de fois que je me suis fait répondre de laisser faire et de continuer à programmer comme c'était parti. Jusqu'à ce que tout pète et que là ça prend 1 an pour tout refaire.
Je ne veux pas te décourager, mais certainement que tu vas avoir de la misère à trouver du temps pour le refaire, car après ça tu vas te faire dire: "Ouais ben là ça fonctionne, touches-y pas et créer des effets de bord".
Bebye !
_________________ Thunder
The two basic principles of Windows administration: - For minor problems, reboot - For major problems, reinstall
|
|
| Haut |
|
 |
|
Page 1 sur 1
|
[ 10 message(s) ] |
|
Qui est en ligne ? |
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité |
|
Vous ne pouvez pas publier de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum
|
|
|
|