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

  FORUM HardWare.fr
  Programmation
  C++

  Appels de fonctions non surchargées

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Appels de fonctions non surchargées

n°550379
peak
Posté le 25-10-2003 à 17:15:00  profilanswer
 

Bonjour à tous,
j'ai une question existentiel sur le cpp;
contexte:
Imaginons une class dont la type des variables membres est donné via un template.  
style:

Code :
  1. template <class Elem>
  2. class my_class{
  3. Elem* position;
  4. Elem* color;
  5. public:
  6. my_class(Elem*);
  7. };
  8. template <class Elem>
  9. my_class<Elem>::my_class(Elem* p, Elem* c){
  10. position=p;
  11.         color=c;
  12. //appel fonction
  13. }


 
à la place de "//appel fonction" je voudrai en fait appeler des fonctions différentes en fonction du type Elem par exemple :

Code :
  1. typedef signed char GLbyte;
  2. typedef float GLfloat;
  3. typedef int GLint;
  4. typedef unsigned int GLuint;
  5. typedef unsigned short GLushort;
  6. void glColor3bv (const GLbyte *v);
  7. void glColor3fv (const GLfloat *v);
  8. void glColor3iv (const GLint *v);
  9. void glColor3uiv (const GLuint *v);
  10. void glColor3usv (const GLushort *v);


Evidement si j?avais simplement eu la fonction glColor3() surchargé, le problème ne se serai pas posé ; mais ce n?est pas le cas dans GL.h.
 
La seule solution qui m'est venu à l'esprit est de retapper une fonction glColor3() surchargé qui elle appelera la fonction de GL.h appropriée.
 
style :  

Code :
  1. void glColor3 (const GLbyte *v){
  2.        glColor3bv(v);
  3. }
  4. void glColor3 (const GLfloat *v){
  5.        glColor3fv(v);
  6. }
  7. void glColor3 (const GLint *v){
  8.        glColor3iv(v)
  9. }
  10. //....


 
Cela ce fait il?
Y'a t-il mieux??
 :)
 

mood
Publicité
Posté le 25-10-2003 à 17:15:00  profilanswer
 

n°550673
chrisbk
-
Posté le 26-10-2003 à 11:34:15  profilanswer
 

ca depend :O
 
1/ C'est pas mal, pense bien a tout mettre dans le .h pour que le compilo inline tout ca
2/ D'un point de vu perf les fonction glColor3f et consorts sont ce qui se fait de pire :D mais c ptet pas ton soucis du moment
 
 

n°551187
LetoII
Le dormeur doit se réveiller
Posté le 27-10-2003 à 08:34:45  profilanswer
 

chrisbk a écrit :

ca depend :O
 
1/ C'est pas mal, pense bien a tout mettre dans le .h pour que le compilo inline tout ca
 
 


 
Le mot clef inline il est pas là pour rien non plus :o


---------------
Le Tyran
n°551207
chrisbk
-
Posté le 27-10-2003 à 08:55:08  profilanswer
 

LetoII a écrit :


 
Le mot clef inline il est pas là pour rien non plus :o


 
:heink:

n°551212
LetoII
Le dormeur doit se réveiller
Posté le 27-10-2003 à 09:03:23  profilanswer
 


 

Code :
  1. class MaClasse
  2. {
  3.   public:
  4. int getMonChamp();
  5. private:
  6.   int monChamp;
  7. };
  8. inline int Maclasse::getMonChamp(){return monChamp;}


 
Fait la même chose que:
 

Code :
  1. class MaClasse
  2. {
  3.   public:
  4. int getMonChamp()
  5. {
  6.   return monChamp;
  7. }
  8. private:
  9.   int monChamp;
  10. };


 
Dans un cas tu déclare explicitement la méthode comem inline, dans l'autre tu le fais implicitement.
 
Après c juste une question de rpésentation.


Message édité par LetoII le 27-10-2003 à 09:04:49

---------------
Le Tyran
n°551214
chrisbk
-
Posté le 27-10-2003 à 09:06:10  profilanswer
 

Bah la je vais parler pour VC6/2002 vu que c les compilos que j'ai le plus utilisé.
 
Si tu la joue comme ca et que tu balances l'implementation de ta fonction dans un fichier non accessible au travers du .h et/ou du cpp en cours de compil, tu va te manger une vilaine erreur de link (j'imagine que les inlines ne sont pas compilés(?) et que comme le compilateur n'a pu trouver l'implem de la fonction lors de la compil il a fait un appel stdart et pouf t'as l'air con)
 
Tu peux me dire qu'en est il dans d'autre compilo ? Y'a des compilos fournis avec un linker suffisament couillu pour faire l'inlining ? (ca me paraitrait surprenant quand meme)
 
Sous VC, inline est utilisé comme indicateur "hey celle la ca serait bien que tu me l'inline". Rien n'oblige le compilo a inline (il fait un calcul cout/gain qu'on peu fait sauter avec __forceinline)
 
 


Message édité par chrisbk le 27-10-2003 à 09:09:57
n°551218
LetoII
Le dormeur doit se réveiller
Posté le 27-10-2003 à 09:09:13  profilanswer
 

chrisbk a écrit :

Bah la je vais parler pour VC6/2002 vu que c les compilos que j'ai le plus utilisé.
 
Si tu la joue comme ca et que tu balances l'implementation de ta fonction dans un fichier non accessible au travers du .h, tu va te manger une vilaine erreur de link (j'imagine que les inlines ne sont pas compilés et que comme le compilateur n'a pu trouver l'implem de la fonction lors de la compil il a fait un appel stdart et pouf t'as l'air con)
 
Tu peux me dire qu'en est il dans d'autre compilo ? Y'a des compilos fournis avec un linker suffisament couillu pour faire l'inlining ? (ca me paraitrait surprenant quand meme)


 
[:xx_xx]
Je veux bien croire que visual est une merde mais là je pense que c toi qui a fait une connerie...


---------------
Le Tyran
n°551221
chrisbk
-
Posté le 27-10-2003 à 09:11:12  profilanswer
 

LetoII a écrit :


 
[:xx_xx]
Je veux bien croire que visual est une merde mais là je pense que c toi qui a fait une connerie...


 
paske toi tu peuxfaire ca :
 
toto.h
 

Code :
  1. class toto
  2. {
  3. inline void truc();
  4. }


 
toto.cpp

Code :
  1. void toto::truc()
  2. {
  3. ...
  4. }


 
 
roger.cpp

Code :
  1. #include "toto.h"
  2. ...
  3. machin.truc();


 
?

n°551228
LetoII
Le dormeur doit se réveiller
Posté le 27-10-2003 à 09:16:48  profilanswer
 

chrisbk a écrit :


 
paske toi tu peuxfaire ca :
 
toto.h
 

Code :
  1. class toto
  2. {
  3. inline void truc();
  4. }


 
toto.cpp

Code :
  1. void toto::truc()
  2. {
  3. ...
  4. }


 
 
roger.cpp

Code :
  1. #include "toto.h"
  2. ...
  3. machin.truc();


 
?


 
Bien sûr que non, désolé j'avais mal lu ta réponse, mais ça te permet de mettre la définition de la méthode en dehors de la définition de la classe, ce qui peut améliorer la lisibilité.


---------------
Le Tyran
n°551232
chrisbk
-
Posté le 27-10-2003 à 09:19:48  profilanswer
 

LetoII a écrit :


 
Bien sûr que non, désolé j'avais mal lu ta réponse, mais ça te permet de mettre la définition de la méthode en dehors de la définition de la classe, ce qui peut améliorer la lisibilité.


 
bien sur que, bien sur que, ca serait pas mal de pouvoir le faire quand meme [:ddr555]
 
bon ben on est d'accord en fait ? :O On va boire un coup pour feter ca ? :D
 

mood
Publicité
Posté le 27-10-2003 à 09:19:48  profilanswer
 

n°551234
LetoII
Le dormeur doit se réveiller
Posté le 27-10-2003 à 09:24:40  profilanswer
 

chrisbk a écrit :


 
bien sur que, bien sur que, ca serait pas mal de pouvoir le faire quand meme [:ddr555]
 
 
 
bon ben on est d'accord en fait ? :O On va boire un coup pour feter ca ? :D
 
 


 
[:meganne] Sans alcool pour moi :D
 


---------------
Le Tyran
n°551236
blackgodde​ss
vive le troll !
Posté le 27-10-2003 à 09:27:25  profilanswer
 

p-e peux-tu spécialiser ton template aussi
 
(si je fais pas d'erreur de syntaxe :)
 

Code :
  1. template <class Elem>
  2.   class my_class{
  3.      Elem* position;
  4.      Elem* color;
  5.     public:
  6.      my_class(Elem*, Elem*);
  7.      template <GLbyte>
  8.      void membre(GLbyte* v);
  9.      template <GLfloat>
  10.      void membre(GLfloat* v);
  11.   };
  12.  
  13.   template <class Elem>
  14.   my_class<Elem>::my_class(Elem* p, Elem* c){
  15.      position=p;
  16.             color=c;
  17.      //appel fonction
  18.   }
  19.   template <GLbyte>
  20.   void my_class<GLbyte>::membre(GLbyte* v) {
  21.      FonctionPourGLbyte(v);
  22.   }
  23.   template <GLfloat>
  24.   void my_class<GLfloat>::membre(GLfloat* v) {
  25.      FonctionPourGLfloat(v);
  26.   }


 
dites moi si j'ai fait une boulette ?


Message édité par blackgoddess le 27-10-2003 à 09:28:19

---------------
-( BlackGoddess )-
n°551238
LetoII
Le dormeur doit se réveiller
Posté le 27-10-2003 à 09:33:43  profilanswer
 

BlackGoddess a écrit :

p-e peux-tu spécialiser ton template aussi
 
(si je fais pas d'erreur de syntaxe :)
 

Code :
  1. template <class Elem>
  2.   class my_class{
  3.      Elem* position;
  4.      Elem* color;
  5.     public:
  6.      my_class(Elem*, Elem*);
  7.      template <GLbyte>
  8.      void membre(GLbyte* v);
  9.      template <GLfloat>
  10.      void membre(GLfloat* v);
  11.   };
  12.  
  13.   template <class Elem>
  14.   my_class<Elem>::my_class(Elem* p, Elem* c){
  15.      position=p;
  16.             color=c;
  17.      //appel fonction
  18.   }
  19.   template <GLbyte>
  20.   void my_class<GLbyte>::membre(GLbyte* v) {
  21.      FonctionPourGLbyte(v);
  22.   }
  23.   template <GLfloat>
  24.   void my_class<GLfloat>::membre(GLfloat* v) {
  25.      FonctionPourGLfloat(v);
  26.   }


 
dites moi si j'ai fait une boulette ?


 
Y a quelques petites erreurs:
 

Code :
  1. template <class Elem>
  2.     class my_class{
  3.          Elem* position;
  4.          Elem* color;
  5.         public:
  6.          my_class(Elem*, Elem*);
  7.    
  8.        
  9.          void membre(Elem* v);
  10.    
  11.        
  12.     };
  13.    
  14.     template <class Elem>
  15.     my_class<Elem>::my_class(Elem* p, Elem* c){
  16.          position=p;
  17.                 color=c;
  18.          //appel fonction
  19.     }
  20.  
  21.         void my_class<GLbyte>::membre(GLbyte* v) {
  22.          FonctionPourGLbyte(v);
  23.     }
  24.  
  25.         void my_class<GLfloat>::membre(GLfloat* v) {
  26.          FonctionPourGLfloat(v);
  27.     }


---------------
Le Tyran
n°551331
blackgodde​ss
vive le troll !
Posté le 27-10-2003 à 11:04:36  profilanswer
 

mci pour la corection :)


---------------
-( BlackGoddess )-
n°551614
peak
Posté le 27-10-2003 à 15:34:24  profilanswer
 

(...je viens de rentrer...)
 
Merci à tous pour vos réponses!  
Je m'édite dessus.  
 

chrisbk a écrit :

ca depend :O
 
1/ C'est pas mal, pense bien a tout mettre dans le .h pour que le compilo inline tout ca
2/ D'un point de vu perf les fonction glColor3f et consorts sont ce qui se fait de pire :D mais c ptet pas ton soucis du moment
 


 
Je vais effectivement les taper en inline, c'est un bon conseil. Je préfère retaper "inline" devant chaqunes d'elles même si j'utilise pour l'instant VC6; au pire dans l'immédiat se sera redondant mais bon, y se peut que je change de compilateur d'ici peu donc je préfère être sûr.
 
2/J'avoue que dans l'immédiat ce n'est pas mon premier soucis mais ce le sera sans doute d'ici peu; cette fonction est desoptimisée par rapport aux autres glcolor3x ou elles le sont toutes au même titre?  
Que me conseils tu?


Message édité par peak le 27-10-2003 à 15:35:41
n°551618
chrisbk
-
Posté le 27-10-2003 à 15:36:45  profilanswer
 

Peak a écrit :

2/J'avoue que dans l'immédiat ce n'est pas mon premier soucis mais se le sera sans doute d'ici peu; cette fonction est desoptimisé par rapport aux autres glcolor3x ou elles le sont toutes au même titre?  
Que me conseils tu?


 
desoptimisé en tout  
Ca te fais un appel de fonction par composante de point (plus les conversions si tu utilises des floats alors que la carte veut des entier)
 
Je te conseillerais de regarder les drawGlElement drawArray (ou dans le gout, OGL ca fait un bail....)
Avant de regarder ca regarde bien avant si tes glVertexMachin ne remplissent quand meme pas le but que tu t'etais assigné, pas la peine de se faire mal pour rien

n°551794
peak
Posté le 27-10-2003 à 18:53:13  profilanswer
 

ok, merci du conseil.
 :jap:


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

  Appels de fonctions non surchargées

 

Sujets relatifs
pb de pointeurs sur fonctions en c++ordre d'évaluation de fonctions
[TOPIC UNIQUE] Vos classes et fonctions PHP. (les votres hein).[C++] Problèmes à la compilation avec des fonctions amies
[Windows] Nomenclature des fonctions : comprendre les windowseriesDocumentation online avec index des fonctions en francais, ca existe ?
[PDA] blocage de fonctions ?[Dev C++] Utiliser les fonctions définies dans une DLL
[DLL] Prototype des fonctions exportéescalcul de fonctions mathématiques
Plus de sujets relatifs à : Appels de fonctions non surchargées


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