petite question sur les classes

petite question sur les classes - C++ - Programmation

Marsh Posté le 19-10-2002 à 14:38:11    

jai une classe complexe declaree comme ceci :
 

Code :
  1. class Complexe {
  2. private :
  3.    int r;  // partie reele
  4.    int i;  // partie imaginaire
  5. public :
  6.    ...
  7. }
  8. Complexe c1,c2,c3;


 
 
pour pouvoir ecrire c1 = c2 + c3, jai surdefini loperateur  
mais comment faire pour que c1 = 5 + c2 fonctionne ?? (ce qui ajouterai 5 a la partie reele de c2 et affecterai le resultat a c1)
 
 :hello:


Message édité par red faction le 19-10-2002 à 14:48:27
Reply

Marsh Posté le 19-10-2002 à 14:38:11   

Reply

Marsh Posté le 19-10-2002 à 14:42:24    

Il faut faire un constructeur Complexe(int reel) qui te permet de construire un complexe qui vaut 0i+reel

Reply

Marsh Posté le 19-10-2002 à 14:44:21    

Et puis il faut que ton opérateur + soit une fonction amie de ta classe.

Reply

Marsh Posté le 19-10-2002 à 14:47:17    

merci pour la reponse je comprend bien comment ca marche, mais pour le mettre en application  :??:  
 

Code :
  1. #include <iostream.h>
  2. // definition de la classe complexe  
  3. class Complexe{
  4. private:
  5. int r;
  6. int i;
  7. public:
  8. Complexe();
  9. Complexe(int);
  10. Complexe(const Complexe &);
  11. Complexe(int, int);
  12. friend ostream& operator <<(ostream& , const Complexe &);
  13. Complexe operator +(Complexe &);
  14. ~Complexe();
  15. };
  16. Complexe::Complexe(){
  17. cout << "  Constructeur 1" << endl;
  18. this->r=0;
  19. this->i=0;
  20. }
  21. Complexe::Complexe(int n){
  22. cout << "  Constructeur 2" << endl;
  23. this->r = n;
  24. this->i = n;
  25. }
  26. Complexe::Complexe(const Complexe &c){
  27. cout << "  Constructeur 3" << endl;
  28. this->i = c.i;
  29. this->r = c.r;
  30. }
  31. Complexe::Complexe(int r, int i){
  32. cout << "  Constructeur 4" << endl;
  33. this->r = r;
  34. this->i = i;
  35. }
  36. ostream& operator << (ostream& out, const Complexe &c){
  37. out << "partie r = "<< c.r << " partie i = " << c.i << endl;
  38. return out;
  39. }
  40. Complexe Complexe::operator +(Complexe &c){
  41. c.i+=this->i;
  42. c.r+=this->r;
  43. return c; //fait appel a constructeur 3
  44. }
  45. Complexe::~Complexe(){
  46. cout << "  Objet detruit" << endl;
  47. }
  48. main(){
  49. Complexe c1 = 5;
  50. Complexe c2 = c1;
  51. Complexe c3 = Complexe (2,3);
  52. Complexe *p_c4;
  53. cout << "premier complexe: " << c1 << "deuxieme complexe: " << c2;
  54. cout << "troisieme complexe: " << c3;
  55. c1 = c3;
  56. cout << c1;
  57. c3 = c1 + c2;
  58. cout << c3;
  59. c3 = 6 + c2;
  60. return 0;
  61. }

Reply

Marsh Posté le 19-10-2002 à 15:25:49    

[:yoyoz]

Reply

Marsh Posté le 19-10-2002 à 15:39:56    

red faction a écrit a écrit :

 
 friend ostream& operator <<(ostream& , const Complexe &);




 
C'est le même principe :
 
friend Complexe& operator +(complexe& , const Complexe &);


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 19-10-2002 à 18:08:37    

kadreg a écrit a écrit :

 
 
C'est le même principe :
 
friend Complexe& operator +(complexe& , const Complexe &);
 




 
marche pas help  
 
: error C2678: binary '+' : no operator defined which takes a left-hand operand of type 'const int' (or there is no acceptable conversion)
 
jai essaye plein de truc mais ca veut pas aller

Reply

Marsh Posté le 19-10-2002 à 18:23:58    

moins personnellement, j'évite les fonctions friend qui n'ont iren a voir dans la triperie de ma classe.
 
je préfère définir les opérations internes puis définir les opérations externes comme fonction "supérieures"
 
pour l'addition par exemple je fait
 

Code :
  1. const Foo& operator+=(const Foo &a)
  2. {
  3. // ...
  4. return *this;
  5. }
  6. Foo operator+(const Foo &a, const Foo &b)
  7. {
  8.   Foo tmp(a);
  9.   return a+=b;
  10. }


 
c'est à mon sens une bonne méthode qui permet de réutilsier un maximum de code et tres performante et ne privilégie pas l'un ou l'autres arguments.
 
 
ce prototype est erroné
 
friend Complexe& operator +(complexe& , const Complexe &);  
 
veut dire que l'on va pouvoir l'invoquer de cette maniere
 
aComplex.operator+(bComplexe, cComplex), donc une addition à 3 arguments...


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 19-10-2002 à 18:45:21    

Taz@PPC a écrit a écrit :

moins personnellement, j'évite les fonctions friend qui n'ont iren a voir dans la triperie de ma classe.
 
je préfère définir les opérations internes puis définir les opérations externes comme fonction "supérieures"
 
pour l'addition par exemple je fait
 

Code :
  1. const Foo& operator+=(const Foo &a)
  2. {
  3. // ...
  4. return *this;
  5. }
  6. Foo operator+(const Foo &a, const Foo &b)
  7. {
  8.   Foo tmp(a);
  9.   return a+=b;
  10. }


 
c'est à mon sens une bonne méthode qui permet de réutilsier un maximum de code et tres performante et ne privilégie pas l'un ou l'autres arguments.
 
 
ce prototype est erroné
 
friend Complexe& operator +(complexe& , const Complexe &);  
 
veut dire que l'on va pouvoir l'invoquer de cette maniere
 
aComplex.operator+(bComplexe, cComplex), donc une addition à 3 arguments...
 




 
ok et pour empchere ca

Reply

Marsh Posté le 19-10-2002 à 18:55:30    

:??:


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 19-10-2002 à 18:55:30   

Reply

Marsh Posté le 19-10-2002 à 19:00:06    

pour empecher de pouvoir utilister c1.operator+

Reply

Marsh Posté le 19-10-2002 à 19:06:42    

:??: ben tu le définis pas c'est tout.
 
y a un truc de pas claire dans tes idées


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 19-10-2002 à 19:09:19    

deux tes 3 constructeurs tu peux n'en faire qu'un
 
Complex(int = 0, int = 0);
 
n'oublie pas le constructeur par recopie
 

Code :
  1. Complexe Complexe::operator +(Complexe &c){
  2.      c.i+=this->i;
  3.      c.r+=this->r;
  4.      return c;//fait appel a constructeur 3  
  5.   }


 
ca veut dire que si tu fait
 
c1+c2
 
c2 est modififé!!!!


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 19-10-2002 à 19:10:29    

ok spa grave fait po attention je debute en c++ (c je connais deja bien)  
 
sinon pour resoudre lerreur que jai a la compilation (en utilisant qd meme friend , je fait comment)

Reply

Marsh Posté le 19-10-2002 à 19:14:28    

si tu ecris
 
5+c1
 
et que tu as complex(int) et operator(const complex &, const complex &), ton compialteur fait operator+(complex(5) c1)
 
la déclaration const & est imporante car complex(5) est un cosnt complex


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 19-10-2002 à 20:00:41    

Taz@PPC a écrit a écrit :

 
ce prototype est erroné
 
friend Complexe& operator +(complexe& , const Complexe &);  
 
veut dire que l'on va pouvoir l'invoquer de cette maniere
 
aComplex.operator+(bComplexe, cComplex), donc une addition à 3 arguments...




 
Ben il me semble que non. C'est un friend, pas un membre. Moi j'ai toujours fait comme ca pour les opérations de ce genre. Cependant, je reconnais que je n'ai jamais essayé d'invoquer des fonctions amies en tant que membre.

Reply

Marsh Posté le 19-10-2002 à 20:19:07    

Code :
  1. #include <iostream.h>
  2. // definition de la classe complexe  
  3. class Complexe{
  4. private:
  5. int r;
  6. int i;
  7. public:
  8. Complexe();
  9. Complexe(int);
  10. Complexe(const Complexe &);
  11. Complexe(int, int);
  12. friend ostream& operator <<(ostream& , const Complexe &);
  13. friend Complexe& operator + (Complexe& out, const Complexe &c);
  14. Complexe& operator +(Complexe &);
  15. int operator [](char *str);
  16. ~Complexe();
  17. };
  18. Complexe::Complexe(){
  19. cout << "  Constructeur 1" << endl;
  20. this->r=0;
  21. this->i=0;
  22. }
  23. Complexe::Complexe(int n){
  24. cout << "  Constructeur 2" << endl;
  25. this->r = n;
  26. this->i = n;
  27. }
  28. Complexe::Complexe(const Complexe &c){
  29. cout << "  Constructeur 3" << endl;
  30. this->i = c.i;
  31. this->r = c.r;
  32. }
  33. Complexe::Complexe(int r, int i){
  34. cout << "  Constructeur 4" << endl;
  35. this->r = r;
  36. this->i = i;
  37. }
  38. ostream& operator << (ostream& out, const Complexe &c){
  39. out << "partie r = "<< c.r << " partie i = " << c.i << endl;
  40. return out;
  41. }
  42. Complexe& operator + (Complexe& out, const Complexe &c){
  43. out = out + c;
  44. return out;
  45. }
  46. Complexe& Complexe::operator +(Complexe &c){
  47. c.i+=this->i;
  48. c.r+=this->r;
  49. return c;
  50. }
  51. Complexe::~Complexe(){
  52. cout << "  Objet detruit" << endl;
  53. }
  54. main(){
  55. Complexe c1 = 5;
  56. Complexe c2 = c1;
  57. Complexe c3 = Complexe (2,3);
  58. Complexe *p_c4;
  59. cout << "premier complexe: " << c1 << "deuxieme complexe: " << c2;
  60. cout << "troisieme complexe: " << c3;
  61. c1 = c3;
  62. cout << c1;
  63. c3 = c1 + c2;
  64. cout << c3;
  65. c1 = 5 + c3;
  66. // error C2678: binary '+' : no operator defined which takes a left-hand operand of type 'const int' (or there is no acceptable conversion)
  67. return 0;
  68. }
  69. //p_c4 = new Complexe;


 
 
voila ou jen suis  :sweat:

Reply

Marsh Posté le 19-10-2002 à 20:28:15    

Code :
  1. Complexe::Complexe(int n){
  2.    
  3.      cout << "  Constructeur 2" << endl;
  4.      this->r = n;
  5.      this->i = n;
  6.   }


 
ca c'est pas bon, ca fait du totu ce qu'on veut
 
 

Code :
  1. Complexe& operator + (Complexe& out, const Complexe &c){
  2. out = out + c;
  3. return out;
  4. }
  5. Complexe& Complexe::operator +(Complexe &c){
  6. c.i+=this->i;
  7. c.r+=this->r;
  8. return c; 
  9. }


 
ca encore moins. tu ferais mieux de réfléchir 5 sec a quoi correspond une addition (par exemple de 2 entiers) et l'affectation
 
essaye de voir comment fonctionne
 
int operator+(const int&, const int&); // 1+3, a+3, b+c
 
int & int::operator(const int &); // a+=3, b+=c
 
pense aussi a définir l'affectation


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 19-10-2002 à 20:28:47    

JE MERITE LE FOUET !!!!!!
 
C'est ma faute, je t'ai filé un opérateur d'addition entre deux complexes, ce n'est pas ce dont tu as besoin :  
 
 
La déclaration dans la classe :

Code :
  1. friend Complexe& operator + (const int, Complexe &c);



Message édité par kadreg le 19-10-2002 à 20:29:10

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 19-10-2002 à 20:29:28    

n'importe quoi!


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 19-10-2002 à 20:46:02    

tu n'as besoin de l'addition qu'entre complexes car l'addition d'un complexe avec autre chose n'a pas de sens


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 19-10-2002 à 22:09:14    

Taz@PPC a écrit a écrit :

Code :
  1. Complexe::Complexe(int n){
  2.    
  3.      cout << "  Constructeur 2" << endl;
  4.      this->r = n;
  5.      this->i = n;
  6.   }


 
ca c'est pas bon, ca fait du totu ce qu'on veut
 
 

Code :
  1. Complexe& operator + (Complexe& out, const Complexe &c){
  2. out = out + c;
  3. return out;
  4. }
  5. Complexe& Complexe::operator +(Complexe &c){
  6. c.i+=this->i;
  7. c.r+=this->r;
  8. return c; 
  9. }


 
ca encore moins. tu ferais mieux de réfléchir 5 sec a quoi correspond une addition (par exemple de 2 entiers) et l'affectation
 
essaye de voir comment fonctionne
 
int operator+(const int&, const int&); // 1+3, a+3, b+c
int & int::operator(const int &); // a+=3, b+=c
 
pense aussi a définir l'affectation
 




 
ca marche pas en tout cas :
 
error C2804: binary 'operator +' has too many parameters

Reply

Marsh Posté le 19-10-2002 à 22:10:54    

c'est pas en me donnant ce code d'erreur que ca va avancer. et tu me la fait pas a moi, c'est pas la première classe que je fais!
 

Code :
  1. Complexe& operator + (Complexe& out, const Complexe &c){ 
  2.    
  3.     out = out + c; 
  4.     return out; 
  5. }


 
sympa ta version récursive!
 
deadloop daitectaid  


Message édité par Taz@PPC le 19-10-2002 à 22:11:55

---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 19-10-2002 à 22:14:58    

Taz@PPC a écrit a écrit :

c'est pas en me donnant ce code d'erreur que ca va avancer. et tu me la fait pas a moi, c'est pas la première classe que je fais!
 

Code :
  1. Complexe& operator + (Complexe& out, const Complexe &c){ 
  2.    
  3.     out = out + c; 
  4.     return out; 
  5. }


 
sympa ta version récursive!
 
deadloop daitectaid  
 




je te rejette pas la faute , vu que c moi qui suis entrain dapprendre la , (et donc de faire les conneries ) , en tout cas il me met ce message derreur la qd je met la decalaration  
int operator+(const int&, const int&);

Reply

Marsh Posté le 19-10-2002 à 22:15:04    

je pars du principe que le constructeur par recopie fonctionne
 
 

Code :
  1. const Complexe& Complexe::operator+=(const Complexe &c)
  2. {
  3.   i+=c.i;
  4.   r+=c.r;
  5.   return *this;
  6. }
  7. Complexe operator+(const Complexe &a, const Complexe &b)
  8. {
  9.   Complexe tmp(a);
  10.   return tmp+=b;
  11. }


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 19-10-2002 à 22:16:28    

Code :
  1. Complexe& operator + (Complexe& out, const Complexe &c){ 
  2.          
  3.         out = out + c; 
  4.         return out; 
  5.   }


 
tu es entrain de délcarer operator+ pour ta classe complexe, c'est normal ton compilateur est du mal.
 
tu lui définit operator+ en fonction de operator+. d'ou l'erreur


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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