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

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

Marsh Posté le 09-01-2003 à 23:51:37    

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
Reply

Marsh Posté le 09-01-2003 à 23:51:37   

Reply

Marsh Posté le 10-01-2003 à 01:03:28    

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

Reply

Marsh Posté le 10-01-2003 à 03:39:21    

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
Reply

Marsh Posté le 10-01-2003 à 09:40:23    

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
Reply

Marsh Posté le 10-01-2003 à 10:18:20    

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

Reply

Marsh Posté le 10-01-2003 à 23:04:20    

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
Reply

Marsh Posté le 11-01-2003 à 01:26:27    

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
Reply

Marsh Posté le 11-01-2003 à 05:41:55    

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

Reply

Marsh Posté le 11-01-2003 à 12:34:34    

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

Reply

Marsh Posté le 11-01-2003 à 20:16:26    

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
Reply

Marsh Posté le 11-01-2003 à 20:16:26   

Reply

Marsh Posté le 11-01-2003 à 20:28:39    

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
Reply

Marsh Posté le 11-01-2003 à 20:41:43    

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.

Reply

Marsh Posté le 11-01-2003 à 20:51:48    

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
Reply

Marsh Posté le 12-01-2003 à 04:44:30    

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
Reply

Marsh Posté le 12-01-2003 à 11:15:36    

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

Reply

Sujets relatifs:

Leave a Replay

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