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

  FORUM HardWare.fr
  Programmation
  C++

  Typage d'un pointeur "void *"

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Typage d'un pointeur "void *"

n°1577827
casper78
Posté le 21-06-2007 à 23:16:19  profilanswer
 

Bonjour tout le monde
 
Je vous soumets un problème qui doit être classique mais dont je n'arrive pas à trouver la  
solution :
 
Voilà , j'ai créé une classe Object et une fonction statique  

Code :
  1. static bool isObject(const void *param) {
  2.   /* Code à déterminer */
  3. }


dont le but est de permettre de savoir si un pointeur (dont on ne connait pas le type) pointe sur une instance
de classe Object.
 
Le problème est que je ne sais pas comment faire  :??:  car la fonction dynamic_cast ne marche pas
sur les pointeurs du type "void *"
 
Donc , si quelqu'un a la réponse, je lui en serai reconnaissant  :jap:  
 
PS : Je me rends tout à fait compte que ce problème est classique.
Donc, pardonnez le débutant que je suis

mood
Publicité
Posté le 21-06-2007 à 23:16:19  profilanswer
 

n°1577838
0x90
Posté le 22-06-2007 à 00:06:47  profilanswer
 

Ce n'est pas vraiment faisable de manière propre.
Cela dit, c'est assez étonnant que tu doive écrire une telle fonction, si tu as vraiment besoin de ça y'a de grande chance qu'il y ait un problème de conception dans ton programme.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1577976
Taz
bisounours-codeur
Posté le 22-06-2007 à 12:35:26  profilanswer
 

utilise des template ou du polymorphisme ou les deux. il est impossible de déterminer a priori ce qui se cache derrière un void*

n°1578122
papangue
Posté le 22-06-2007 à 16:24:44  profilanswer
 

Je suis surpris, et comme dis Taz, utilise du polymorphisme ou du template..e une autre solution consisterai à implementer une RTTI aussi je pense... mais cela dépend beaucoup des besoins réels derrière.

n°1578146
Taz
bisounours-codeur
Posté le 22-06-2007 à 16:59:41  profilanswer
 

quoi 'implémenter une RTTI' ? si ton void* pointe vers n'importe ou, tu ne pourras rien en faire

n°1578409
casper78
Posté le 23-06-2007 à 20:26:39  profilanswer
 

Messieurs  
 
Suite à vos interventions, quelques questions me viennent à l'esprit :
 
1) Qu'est-ce qu'une RTTI ? (Je précise : je suis un gros débutant)
 
2) Pour préciser mon problème, je vous le présente
 
j'ai créé une classe template Polynome qui dérive d'une classe Object qui possède  
une méthode hashCode() (pour faire "comme JAVA" )
 

Code :
  1. template<class C> class Polynome : public virtual Object {
  2. private :
  3.  int m_nDegre;  // Degré du polynome
  4.  C* m_oCoeff; // Tableau de coefficients
  5.        public:
  6.                int hashCode();  // Calcul du code de hachage
  7.        /* Autres methodes */
  8. }


 
Et voici mon problème qui vient avec ses gros sabots : l'implémentation de ma méthode "hashCode"
dépends de la classe C

  • si c'est int => j'utilise directement la valeur
  • si c'est une classe dérivant de la clase Object, j'utilise la méthode "hashCode" de C


Voilà !
Donc, si quelqu'un peut résoudre mon problème (solution technique ou nouvelle implémentation, .. etc) je lui
en serais très reconnaissant  :jap:  
 
 
 

n°1578414
0x90
Posté le 23-06-2007 à 20:32:53  profilanswer
 

Avec une spécialisation de ton template pour les int tu t'en sors facilement.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1578434
casper78
Posté le 23-06-2007 à 21:40:02  profilanswer
 

0x90 a écrit :

Avec une spécialisation de ton template pour les int tu t'en sors facilement.


 
 
Merci, c'est exactement ce qu'il fallait  :pt1cable:  
J'ai juste utilisé une spécialisation partielle de la méthode hashCode pour les "int" et pour  
la classe Object.
 
Par contre, je n'ai pas compris (cette question étant pour ma culture générale) à quoi peut servir la spécialisation
totale. Cela me semble bien lourd car il recoder la classe complètement.
 
En gros, merci  :jap:  
Par contre, si quelqu'un pouvait me donner un exemple de spécialisation totale de template, je lui
en serais reconnaissant :jap:

n°1578701
papangue
Posté le 25-06-2007 à 09:49:30  profilanswer
 

Taz a écrit :

quoi 'implémenter une RTTI' ? si ton void* pointe vers n'importe ou, tu ne pourras rien en faire


désolé et ne plus utilisé de void* mais un MaClassBase*.... Mais je supposait que cela allait de soit, puisqu'il veut tester si son pointeur est de type UnObject (qui dérive de MaClassBase)...  

Citation :

mais cela dépend beaucoup des besoins réels derrière.

comme je l'ai dit plus haut.
 
Taz => s'il te plait lit entièrement les réponses données avant de t'emballer. Ce sera plus constructif pour tout le monde, je pense  :jap: . Par contre je ne remets pas en cause tes intervention qui me sont au passage toujours très intructives  :ange: .
 
Edit: voilà une spécialisation de template est plus approprié dans ce cas...
casper78 => merci d'avoir préciser ta demande.
 
Cdt,


Message édité par papangue le 25-06-2007 à 09:51:36
n°1598414
sam_b
Posté le 10-08-2007 à 20:17:43  profilanswer
 

Hello
Une autre solution pour connaître le type des classes dérivées (c'est pas très jojo mais ça marche). En revanche, c'est bien entendu limité aux classes connues.
De façon générale, le fait de récupérer dynamiquement le type de l'objet n'est ni facile ni conseillé. Le mieux étant de programmer autrement... c'te réponse de normand...
 
Définition des classes à exploiter (sans les constructeur/destructeur... à implémenter si on veut être propre).

Code :
  1. class moman
  2. {
  3. public:
  4.   virtual bool IsFille1() const { return false; }  // Retournera true si on a fait une allocation sur la 1ière classe dérivée.
  5.   virtual bool IsFille2() const { return false; }  // Idem mais sur la seconde.
  6. };
  7. // Ensuite on surcharge les opérations de spécification du type de l'objet manipulé
  8. class fille1 : public moman { public: bool IsFille1() const { return true; } };
  9. class fille2 : public moman { public: bool IsFille2() const { return true; } };


 
Un ti nexemple

Code :
  1. void main()
  2. {
  3.   moman* table[2];  // Attention : les données manipulées sont des pointeurs
  4.   table[0] = new fille1();
  5.   table[1] = new fille2();
  6.   table[0]->IsFille1();   // Retourne true, ensuite on peut faire un cast genre "(Fille1*)table[0]"
  7.   table[0]->IsFille2();   // Retourne false, cast impossible
  8.   table[1]->IsFille1();   // Retourne false
  9.   table[1]->IsFille2();   // Retourne true
  10. }


 
Voilou

mood
Publicité
Posté le 10-08-2007 à 20:17:43  profilanswer
 

n°1598492
Joel F
Real men use unique_ptr
Posté le 10-08-2007 à 22:16:27  profilanswer
 

c'est assez moche. dynamic_cast c'ets pour les poulaisn ousbeques ?

n°1598550
IrmatDen
Posté le 11-08-2007 à 12:48:11  profilanswer
 

J'imagine que, bien que crade, ça doit pouvoir être utilisé comme le rtti du pauvre non? Par "pauvre", j'entends les environnements où le rtti standard du C++ est trop coûteux (comme le dev sur DS).

n°1598578
Joel F
Real men use unique_ptr
Posté le 11-08-2007 à 13:47:53  profilanswer
 

mouais ... mais bon, si tu en ai à programmer sur ce genre de plate-forme (j'ai fait de al GBA à un moment), t'evites completement l'e shierarchies d'objet complexes comme ça.
 

n°1598580
IrmatDen
Posté le 11-08-2007 à 13:59:06  profilanswer
 

Oula, personnellement je ne m'y suis pas encore attaqué :D
C'est un pote qui en fait, et il me disait juste qu'ils font des cast C au lieu des casts C++; sur le coup je suis parti du principe que tu as énoncé, mais je me demande si c'est renforcé par ce genre de tests. Je lui poserais la question tiens...


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

  Typage d'un pointeur "void *"

 

Sujets relatifs
new qui renvoie un pointeur énorme?liste chnainée avec 2 pointeur sur le premier et le dernier element
pointeur sur fonction membre / switch case[debutant] pointeur
[Résolu] Problème polymorphisme et sous typageargument void *
Pointeur sur fonctionvoid
Typage en PHP POOPointeur ou pas ? (résolu)
Plus de sujets relatifs à : Typage d'un pointeur "void *"


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