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

  FORUM HardWare.fr
  Programmation
  C++

  [VC++6]Problème de surdéf de pow avec une class BigInt

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VC++6]Problème de surdéf de pow avec une class BigInt

n°283261
galett
Miam Miam des galettes !
Posté le 09-01-2003 à 23:51:37  profilanswer
 

Voilà, je travaille depuis qqs jours sur une classe de grands entiers, et bon pour surdéfinir les opérateurs pas de problèmes. Par contre j'ai voulu surdéfinir qqs fonctions existantes :
comme la fonction 'abs' qui fonctionne à merveille avec mes grands entiers(class Top),

Code :
  1. Top abs ( const Top& GE )
  2. {
  3. Top  r(GE)  ;//appelle le constructeur de recopie
  4. r.SetSigne( true )  ;//signe + pour valeur absolue
  5. return r   ;//on retourne r
  6. }


 
 
par contre il y a des problèmes lorsque je veux surdéfinir la fonction pow

Code :
  1. Top pow ( const Top& GE, const int& n )
  2. {
  3. ...
  4. <le code de la fonction>
  5. ...
  6. }


 
et voila ce que le compilo m'envoie en erreur :  

Code :
  1. error C2666: 'pow' : 3 overloads have similar conversions
  2. OperateursGlobaux.cpp


 
ceci est du à l'appel de pow de la manière suivante :
pow(2,100000);
 
en fait le compilo voit un conflit car il peut convertir le 2 en Top grâce au constructeur Top(int) ou bien utiliser son pow natif pow(int,int)
comment fais-je ?
 
faut-il que je créer la fonction puissance en tant que méthode, ou bien que jechange son nom de fonction ? ça m'embête un peu qd même...


---------------
mon NAS/HTPC Q11 H55N-USB3, Core i3 http://forum.hardware.fr/hfr/Hardw [...] m#t7599404
mood
Publicité
Posté le 09-01-2003 à 23:51:37  profilanswer
 

n°283347
Kristoph
Posté le 10-01-2003 à 01:03:28  profilanswer
 

Tu ecris pow(BigInt(3),10000); ou alors tu change de nom de fonction

n°283361
nraynaud
lol
Posté le 10-01-2003 à 03:39:21  profilanswer
 

Galett a écrit :


en fait le compilo voit un conflit car il peut convertir le 2 en Top grâce au constructeur Top(int) ou bien utiliser son pow natif pow(int,int)
comment fais-je ?
 
faut-il que je créer la fonction puissance en tant que méthode, ou bien que jechange son nom de fonction ? ça m'embête un peu qd même...
 


 
Je te conseille de ne pas utiliser cette notation qui n'est pas objet, mais d'utiliser la notation objet : monint.pow(other).
 
Tu wrappe tes entier dans une classe Integer (fait gaffe à éviter les références car ta classe est toute petite) avec une méthode pow(Integer) et une méthode pow(Top), tu mets les mêmes méthodes dans Top.
C'est pas complètement objet mais ça aura exactement la sémantique de ce que tu veux faire.
 
Pour carrément tout planquer proprement et de façon objet (le passage de small vers big), j'ai écris un article dessus pour ma promo : http://nraynaud.com.free.fr/td3dispatching.html n'oublie pas qu'en C++ il faut utiliser "virtual" partout pour que ça fonctionne.


Message édité par nraynaud le 10-01-2003 à 03:41:15
n°283390
galett
Miam Miam des galettes !
Posté le 10-01-2003 à 09:40:23  profilanswer
 

Citation :

Kristoph  Tu ecris pow(BigInt(3),10000); ou alors tu change de nom de fonction


en fait j'aimerais garder l'écriture conventionnelle, et pour l'exemple que tu me donnes, c'est pas tout à fait ça que je veux, mais utiliser le pow(int,int) si j'appelle pow avec un int et pow(Top, int) si j'appelle avec un Top
 
 

Citation :

Tu wrappe tes entier dans une classe Integer (fait gaffe à éviter les références car ta classe est toute petite)


en gros ce serait créer la classe Int en java, et euh par contre je vois pas trop pourquoi éviter les références quand une classe est petite ?
 
 
 

Citation :

avec une méthode pow(Integer) et une méthode pow(Top), tu mets les mêmes méthodes dans Top.


 
je vois ce que ça donne, mais c'est pas tout à fait ça que je voulais, car je serais quand même obligé de typer le int en Integer...M'enfin bon, je vais tenter d'arranger ça. Merci pour le lien :jap:


---------------
mon NAS/HTPC Q11 H55N-USB3, Core i3 http://forum.hardware.fr/hfr/Hardw [...] m#t7599404
n°283406
Kristoph
Posté le 10-01-2003 à 10:18:20  profilanswer
 

Ah bah, si c'est ça c'est facile alors :)
 
http://www.glenmccl.com/tip_023.htm
 

n°283912
galett
Miam Miam des galettes !
Posté le 10-01-2003 à 23:04:20  profilanswer
 

kweel ! merci kristoph ! c'est exactement le mot qu'il me fallait, explicit  :D j'y ai pas vraiement cru au début, et puis si en fait, c'est parfait. j'ai failli devenir  :pt1cable: pendant un moment, et puis retour à l'état normal  :heink:


---------------
mon NAS/HTPC Q11 H55N-USB3, Core i3 http://forum.hardware.fr/hfr/Hardw [...] m#t7599404
n°283960
Musaran
Cerveaulté
Posté le 11-01-2003 à 01:26:27  profilanswer
 

Citation :

en fait le compilo voit un conflit car il peut convertir le 2 en Top grâce au constructeur Top(int) ou bien utiliser son pow natif pow(int,int)

Je pense pas que ce soit ça exactement, il choisirait 'pow(int,int)' directement sans ambigüité.
Le pow C est 'pow(double,double)', le pow stl utilises des complexes.
 

nraynaud a écrit :

Je te conseille de ne pas utiliser cette notation qui n'est pas objet, mais d'utiliser la notation objet : monint.pow(other).


Je ne le conseille pas.
Cela empêcherait d'écrire du code générique utilisant indifféramment les types de base ou utilisateur.
'pow' est une fonction ou un algorithme avant d'être un attribut du type.
 
Tu vois toujours des objets partout.
Celui qui n'a qu'un marteau comme outil vois tous les problèmes comme des clous.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°283980
nraynaud
lol
Posté le 11-01-2003 à 05:41:55  profilanswer
 

Musaran a écrit :

[quote]
Je ne le conseille pas.
Cela empêcherait d'écrire du code générique utilisant indifféramment les types de base ou utilisateur.
'pow' est une fonction ou un algorithme avant d'être un attribut du type.
 
Tu vois toujours des objets partout.
Celui qui n'a qu'un marteau comme outil vois tous les problèmes comme des clous.


 
J'ai donné la méthode pour écrire du code générique 46 000 fois, et la méthode pour l'étendre sans tout réécrire et sans tout revalider, ça commence à me gonfler, le C++ est fait pour faire de l'objet, pas pour faire n'importe quoi et se demander pourquoi ça marche pas ensuite. Si des tocards ont décidé de garder des types primitifs dans leur langage soit-disant "de haut niveau", je n'y suis pour rien, c'est pas une raison pour plier l'échine et conseiller de faire des conneries à n'importe qui sur le net sous-prétexte d'un pseudo-anonymat.
 
Concernant ma limitation d'esprit à l'objet, je peux te trainer très loin dans l'applicatif (souvent appelé fonctionel) sans sourciller, j'en suis quasiment certain, sauf que je ne vois ni de forum ni de questions pour en parler ici, c'est tout simplement pas à la mode (bien malgré moi).

n°284047
Kristoph
Posté le 11-01-2003 à 12:34:34  profilanswer
 

Musaran a écrit :

[quote]Tu vois toujours des objets partout.


 
C'est normal, il fait partie de la secte de Bertrand Meyers. J'en connais pas mal d'autres comme ça ;)
 
Mais il a raison sur ce point, c'est bien ave pow(double, double) qu'il i a conflit. Il te suffit de ne pas include cmath pour être tranquille. Si vraiment tu as besoin de cmath il ne te reste que à lever toi même l'ambiguité.

n°284284
galett
Miam Miam des galettes !
Posté le 11-01-2003 à 20:16:26  profilanswer
 

bah, ça marche avec le mot-clef explicit, alors  :jap:  


---------------
mon NAS/HTPC Q11 H55N-USB3, Core i3 http://forum.hardware.fr/hfr/Hardw [...] m#t7599404
mood
Publicité
Posté le 11-01-2003 à 20:16:26  profilanswer
 

n°284287
galett
Miam Miam des galettes !
Posté le 11-01-2003 à 20:28:39  profilanswer
 

sinon nraynaud, je suis d'accord avec toi sur le fait que le c++ c'est fait pour faire de la prog objet. Mais là, ma classe, je compte l'optimiser à fond, quand je l'aurai bien travaillée et totalement finie, je commencerai à passer des instructions MMX(mais c'est pas objet là-dedans ? tu me diras autant coder en C) Mais bon, quand ma classe sera terminé, elle sera très simple d'utilisation, après tout, je garde la notion d'encapsulation, peu importe si j'utilise de l'ASM après à l'intérieur de la classe,(les gains seront assez énormes, G fais qqs tests, vu que je n'utilise pas les regsitres FPU, je peux optimiser en MMX :)
pour l'opérateur multiplication, ça va bien m'aider, et puis cette classe Top, je vais la maltraiter par la suite, (construction de matrice de Van Der Monde conçue sur ma classe Top, recherche d'équation de polynomes à partir de coordonnées de points). Voila, donc je suis tout à fait conscient de réaliser un code "batard", ne vous inquietez pas :pt1cable:  
le proc va chauffer :D


---------------
mon NAS/HTPC Q11 H55N-USB3, Core i3 http://forum.hardware.fr/hfr/Hardw [...] m#t7599404
n°284291
Kristoph
Posté le 11-01-2003 à 20:41:43  profilanswer
 

A mon avis, tu ne devrait pas mettre explicit sur ce constructeur car c'est dans ces situations que les conversions implicites sont utiles. Tu devrais plustot renomer ta fonction pow ou la mettre dans un namespace adapté. Et la ou il y a conflit, l'utilisateur devra lever lui même l'ambiguité en fesant des cast explicites.
 
Sans explicit : toute fonction qui attend un Top peut etre appelée avec un int et C++ fera la conversion à la main.
Avec explicit : toute fonction qui attend un Top doit recevoir un Top et donc tu devras mettre à la main les appels de constructeur.
 
Quite à choisir, je prefere la première solution surtout qu'il est facile pour toi de differencier ta fonction pow de celle de cmath.

n°284304
galett
Miam Miam des galettes !
Posté le 11-01-2003 à 20:51:48  profilanswer
 

je crois ke je v suivre ton conseil en fait, j'avais pas pensé à ça   :whistle:


---------------
mon NAS/HTPC Q11 H55N-USB3, Core i3 http://forum.hardware.fr/hfr/Hardw [...] m#t7599404
n°284491
Musaran
Cerveaulté
Posté le 12-01-2003 à 04:44:30  profilanswer
 

nraynaud a écrit :

le C++ est fait pour faire de l'objet

Pas seulement. Le créateur du C++ parle du multi-paradigme.
 

Citation :

Si des tocards ont décidé de garder des types primitifs dans leur langage soit-disant "de haut niveau"...

Pour des raisons de performances peut-être ? En Java c'est pareil.
Cela dit, si on ne peut pas en dériver, c'est à cause de leur comportement historique (promotion, entre autres).
 
Pour le fonctionnel: J'apprendrais ça plus tard. C'est pas en C++ que je pourrais le faire.
 
Et puis tu t'énerves trop, c'est pas bon pour la santé. Kip cool.
 
 
Mais je comprends pas...

Code :
  1. Top    pow ( const Top&, const int&);
  2. double pow ( double    , double    );
  3. pow(       2 ,        100000 ); //appel demandé (   int,    int)
  4. pow(   Top(2),        100000 ); //possibilité   (   Top,    int)
  5. pow(double(2), double(100000)); //possibilité   (double, double)

Il considère comme également éligibles une conversion utilisateur et 2 promotions de type intégré ?
Il me semble qu'une seule conversion est priotaire sur deux...


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°284505
Kristoph
Posté le 12-01-2003 à 11:15:36  profilanswer
 

Mettre des priorités sur les conversions implicites c'est mal en fait, car ca rend le système difficile a prédire pour l'utilisateur. En cas d'ambiguité il vaut mieux la laisser en place  que de faire un choix arbitraire. "Explicit is better than implicit", sauf quand ce n'est pas ambigu


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

  [VC++6]Problème de surdéf de pow avec une class BigInt

 

Sujets relatifs
problème pour insérer une vidéo[JAVA] probléme d'execution d'un programme
Probleme de link sous project builder (mac) en c++[Swing] Problème de raffraichissement d'écran dans un jeu
probleme d analyse pour redondanceDe gros problème avec le css : je comprend rien
[C++] Probleme de libération de mémoire--> Probleme pour recupérer une valeur dans une liste ! HELP !!!!! <--
Problème d'ImpressionProbleme de retour d'un servlet vers un jsp
Plus de sujets relatifs à : [VC++6]Problème de surdéf de pow avec une class BigInt


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