Typage d'un pointeur "void *"

Typage d'un pointeur "void *" - C++ - Programmation

Marsh Posté le 21-06-2007 à 23:16:19    

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

Reply

Marsh Posté le 21-06-2007 à 23:16:19   

Reply

Marsh Posté le 22-06-2007 à 00:06:47    

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

Marsh Posté le 22-06-2007 à 12:35:26    

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*

Reply

Marsh Posté le 22-06-2007 à 16:24:44    

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.

Reply

Marsh Posté le 22-06-2007 à 16:59:41    

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

Reply

Marsh Posté le 23-06-2007 à 20:26:39    

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:  
 
 
 

Reply

Marsh Posté le 23-06-2007 à 20:32:53    

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

Marsh Posté le 23-06-2007 à 21:40:02    

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:

Reply

Marsh Posté le 25-06-2007 à 09:49:30    

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
Reply

Marsh Posté le 10-08-2007 à 20:17:43    

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

Reply

Marsh Posté le 10-08-2007 à 20:17:43   

Reply

Marsh Posté le 10-08-2007 à 22:16:27    

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

Reply

Marsh Posté le 11-08-2007 à 12:48:11    

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

Reply

Marsh Posté le 11-08-2007 à 13:47:53    

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.
 

Reply

Marsh Posté le 11-08-2007 à 13:59:06    

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

Reply

Sujets relatifs:

Leave a Replay

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