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

  FORUM HardWare.fr
  Programmation
  C++

  petite question sur les classes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

petite question sur les classes

n°230785
red factio​n
Posté le 19-10-2002 à 14:38:11  profilanswer
 

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
mood
Publicité
Posté le 19-10-2002 à 14:38:11  profilanswer
 

n°230787
heffer
PDG du Site des Mains
Posté le 19-10-2002 à 14:42:24  profilanswer
 

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

n°230788
heffer
PDG du Site des Mains
Posté le 19-10-2002 à 14:44:21  profilanswer
 

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

n°230791
red factio​n
Posté le 19-10-2002 à 14:47:17  profilanswer
 

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

n°230805
red factio​n
Posté le 19-10-2002 à 15:25:49  profilanswer
 

[:yoyoz]

n°230807
kadreg
profil: Utilisateur
Posté le 19-10-2002 à 15:39:56  profilanswer
 

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 !
n°230860
red factio​n
Posté le 19-10-2002 à 18:08:37  profilanswer
 

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

n°230863
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 19-10-2002 à 18:23:58  profilanswer
 

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++]
n°230867
red factio​n
Posté le 19-10-2002 à 18:45:21  profilanswer
 

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

n°230870
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 19-10-2002 à 18:55:30  profilanswer
 

:??:


---------------
du bon usage de rand [C] / [C++]
mood
Publicité
Posté le 19-10-2002 à 18:55:30  profilanswer
 

n°230871
red factio​n
Posté le 19-10-2002 à 19:00:06  profilanswer
 

pour empecher de pouvoir utilister c1.operator+

n°230872
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 19-10-2002 à 19:06:42  profilanswer
 

:??: 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++]
n°230874
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 19-10-2002 à 19:09:19  profilanswer
 

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++]
n°230875
red factio​n
Posté le 19-10-2002 à 19:10:29  profilanswer
 

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)

n°230876
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 19-10-2002 à 19:14:28  profilanswer
 

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++]
n°230899
Ace17
Posté le 19-10-2002 à 20:00:41  profilanswer
 

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.

n°230905
red factio​n
Posté le 19-10-2002 à 20:19:07  profilanswer
 

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:

n°230908
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 19-10-2002 à 20:28:15  profilanswer
 

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++]
n°230909
kadreg
profil: Utilisateur
Posté le 19-10-2002 à 20:28:47  profilanswer
 

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 !
n°230910
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 19-10-2002 à 20:29:28  profilanswer
 

n'importe quoi!


---------------
du bon usage de rand [C] / [C++]
n°230912
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 19-10-2002 à 20:46:02  profilanswer
 

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++]
n°230967
red factio​n
Posté le 19-10-2002 à 22:09:14  profilanswer
 

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

n°230969
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 19-10-2002 à 22:10:54  profilanswer
 

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++]
n°230971
red factio​n
Posté le 19-10-2002 à 22:14:58  profilanswer
 

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&);

n°230973
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 19-10-2002 à 22:15:04  profilanswer
 

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++]
n°230974
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 19-10-2002 à 22:16:28  profilanswer
 

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++]
mood
Publicité
Posté le   profilanswer
 


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

  petite question sur les classes

 

Sujets relatifs
Question d'ordre générale sur vieux osObjets, Classes, Fonctions avec objets en paramétres, *, & :Prob.
Question bete en C comme je deteste ce langage de merde[SQL SERVER] Un petite question !
[C] - Question sur strstr()Question pour les pros du batch sous windows (nt/2000)
[PHP] Question aux utlisateurs de phpBB (ver. 2.0.3) [Newbie][PRO*C] Question a 2 euros balles
Petite question sur un fscanf 
Plus de sujets relatifs à : petite question sur les classes


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