comment déclarer un nouvel operateur ?

comment déclarer un nouvel operateur ? - C++ - Programmation

Marsh Posté le 16-01-2003 à 18:14:40    

Bonjour,
 
g déclaré un nouveau type : MYTYPE
je voudrais créer un nouvel opérateur pour pouvoir faire des opérations avec mes types. Comment faire ?
 
je voudrais pouvoir faire :
 

Code :
  1. MYTYPE Var1;
  2. MYTYPE Var2;
  3. // remplissage
  4. MYTYPE Res;
  5. Res = Var1 Oper Var2;


 
comment déclarer Oper pour pouvoir faire comme si c t une fonction ?
 
mci
bonne prog


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 16-01-2003 à 18:14:40   

Reply

Marsh Posté le 16-01-2003 à 18:22:48    

Tu ne peux pas creer de nouveaux opérateurs en C++, mais tu peux utiliser les opérateurs existant.

Reply

Marsh Posté le 16-01-2003 à 18:28:19    

il est aussi possible de surcharger certains opérateurs ... en les obligeant de faire ce qu'on veut ...

Reply

Marsh Posté le 16-01-2003 à 18:59:36    

Code :
  1. void * __cdecl operator new( unsigned int cb )
  2. {
  3.     // ...
  4. }


 
Ceci est tiré d'une source qui fonctionne si on enleve les lib par defaut dans vc++ 6.0
 
ce n'est pas la déclaration de l'operateur new ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 16-01-2003 à 19:03:38    

ah ! a ce que je viens de voir on peut juste redéclarer les existants.
 
je voudrais redéclarer ^ et % (puissance et modulo) pour qu'ils fonctionnent avec mon type. Comment faire ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 16-01-2003 à 19:08:01    

exemple :  
complexe operator "+"(complexe a,complexe b){};

Reply

Marsh Posté le 16-01-2003 à 19:09:41    

Il faut que ta nouvelle déclaration prenne en paramètre au moins 1 objet.
 
Exemple d'operateur + pour une classe BigInt :

Code :
  1. const BigInt operator + (const BigInt & a, const BigInt & b)
  2. {
  3.    BigInt resultat;
  4.    // Ici le code
  5.    return resultat;
  6. }


Message édité par Kristoph le 16-01-2003 à 19:13:44
Reply

Marsh Posté le 16-01-2003 à 19:09:45    

lapiou a écrit :

exemple :  
complexe operator "+"(complexe a,complexe b){};

c'est là le future du C++, mais rien de standard, j'en ai juste vu dans des drafts du comité et dans des articles de BS

Reply

Marsh Posté le 16-01-2003 à 19:11:12    

avec "+" il me pond 6 erreurs,  
avec + il me sort qu'il doit au moins y avoir un operateur de type class


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 16-01-2003 à 19:12:11    

BlackGoddess a écrit :


 
ce n'est pas la déclaration de l'operateur new ?


 
new existe déjà dans la base du C++ ...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 16-01-2003 à 19:12:11   

Reply

Marsh Posté le 16-01-2003 à 19:17:58    

Reply

Marsh Posté le 16-01-2003 à 19:18:10    

bouarf je lache laffaire je v faire des fonctions plutot ...


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 16-01-2003 à 19:19:09    

non en fait le lien explique bien je m'y remet :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 18-01-2003 à 03:53:45    

Version globale amie

Code :
  1. class MYTYPE{
  2. int value;
  3. public:
  4. friend const MYTYPE operator+(const MYTYPE&, const MYTYPE &); //autorise l'opérateur global à lire value privé
  5. }
  6. //opérateur global, les deux opérandes peuvent être des types dérivés de MYTYPE.
  7. const MYTYPE operator+(const MYTYPE& left_operand, const MYTYPE & right_operand){
  8. MYTYPE resultat;
  9. resultat.value = left_operand.value + right_operand.value;
  10. return resultat;
  11. }


Version membre

Code :
  1. class MYTYPE{
  2. int value;
  3. public:
  4. //opérateur membre, l'opérande gauche ne peut être que de type MYTYPE exactement.
  5. const MYTYPE operator+(const MYTYPE & right_operand){ //l'opérande gauche est implicitement *this
  6.  MYTYPE resultat;
  7.  resultat.value = this->value + right_operand.value; //this-> est optionnel
  8.  return resultat;
  9. }
  10. }


Utilisation

Code :
  1. MYTYPE a, b;
  2. a+b; //version sucrée
  3. operator+(a,b); //ce qui a vraiment lieu (cas friend)
  4. a.operator+(b); //ce qui a vraiment lieu (cas membre)


 
Fais attention avec ^, il est moins prioritaire que l'addition et même la comparaison, et cela ne peut se changer.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 18-01-2003 à 05:54:43    

western a écrit :

il est aussi possible de surcharger certains opérateurs ... en les obligeant de faire ce qu'on veut ...


Non, non, non, pas "ce qu'on veut", on prolonge leur fonctionnement habituel sur des nouveaux objets, par exemple, prolonger + sur des vecteurs (addition membre à membre), c'est bon, mais on fait pas n'improte quoi, ne serait-ce qu'à cause des priorités et associativités fixes mais surtout pour la qualité (et donc, entre autre la lisibilité du code)
ex :
b^c=a  
si je te dis que j'ai défini ^ comme affectation pour mon type et = comme une loi de groupe, à la relecture, c'est pas hyper évident et la qualité baisse inévitablement.
 
Préservez un maximum des propriétés de vos opérateurs. Et utilisez des fonctions qui sont largement plus lisibles et moins casse-gueules.

Reply

Marsh Posté le 18-01-2003 à 11:55:56    

merci pour toutes ces explications :)


---------------
-( BlackGoddess )-
Reply

Sujets relatifs:

Leave a Replay

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