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

  FORUM HardWare.fr
  Programmation
  C++

  probleme d'heritage

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

probleme d'heritage

n°297835
peak
Posté le 31-01-2003 à 12:47:05  profilanswer
 

je ne comprend pas où est mon erreur??
les trois premieres lignes du main s'executent sans prob, donc la class Matrix ne pose pas de prob par contre la ligne suivante cause une erreure, je ne comprend pas l'erreur (a mon avis ça doit être un truc dont je suis pas aucourant appropos des héritages...)  
 
voici le code: (c'est le constructeur de copie de la class BASE ki couille)

Code :
  1. #include<iostream.h>
  2. template <class Type>
  3. class Matrix{
  4. public:
  5. Type** M;
  6. unsigned n;
  7. Matrix(unsigned =0);
  8. Matrix(const Matrix& Mat) { Copy(Mat); }
  9. ~Matrix() { Erase(); }
  10. void Copy(const Matrix&);
  11. void Erase();
  12. Matrix& operator= (const Matrix&);
  13. Matrix& operator*= (const Matrix&);
  14. void Display();
  15. };
  16. template<class Type>
  17. Matrix<Type>::Matrix(unsigned x){
  18. n=x;
  19. M=new unsigned* [n];
  20. for(unsigned i=0; i<n; i++)
  21.  M[i]= new Type[n];
  22. for(unsigned j=0; j<n; j++)
  23.  for(unsigned k=0; k<n; k++){
  24.   if(j!=k) M[j][k]=0;
  25.   else M[j][k]=1;
  26.  }
  27. }
  28. template<class Type>
  29. void Matrix<Type>::Copy(const Matrix& Mat){
  30. n=Mat.n;
  31. M=new unsigned* [n];
  32. for(unsigned h=0; h<n; h++)
  33.  M[h]= new Type[n];
  34. for(unsigned i=0; i<n; i++)
  35.  for(unsigned j=0; j<n; j++)
  36.   M[i][j]=Mat.M[i][j];
  37. }
  38. template<class Type>
  39. void Matrix<Type>::Erase(){
  40. for(unsigned i=0; i<n; i++)
  41.  delete[] M[i];
  42. delete[] M;
  43. M=NULL;
  44. n=0;
  45. }
  46. template<class Type>
  47. Matrix<Type>& Matrix<Type>::operator= (const Matrix& Mat){
  48. Erase();
  49. Copy(Mat);
  50. return *this;
  51. }
  52. template<class Type>
  53. Matrix<Type>& Matrix<Type>::operator*= (const Matrix& Mat){
  54. if(n!=Mat.n)
  55.  cerr<<"ERROR : Matrix<Type>& Matrix<Type>::operator*= (const Matrix& Mat)";
  56. else{
  57.  Matrix<Type> tmp(n);
  58.  for(unsigned i=0; i<n; i++)
  59.   for(unsigned j=0; j<n; j++){
  60.    tmp.M[i][j]=0;
  61.    for(unsigned k=0; k<n; k++)
  62.     tmp.M[i][j]+=M[i][k]*M[k][j];
  63.   }
  64.  Copy(tmp);
  65. }
  66. return *this;
  67. }
  68. template<class Type>
  69. void Matrix<Type>::Display(){
  70. for(unsigned i=0; i<n; i++){
  71.  for(unsigned j=0; j<n; j++)
  72.   cout<<"\t"<<M[i][j];
  73. }
  74. }
  75. /************************************************************************************************
  76. /*****************************************BASE<TYPE>**********************************************/
  77. template<class Type>
  78. class BASE: public Matrix<Type>{
  79. public:
  80. Type* RGB;
  81. BASE(unsigned n=0, Type* rgb=NULL): RGB(rgb), Matrix<Type>(n) {}
  82. BASE(unsigned , Type R, Type G, Type B): RGB(new Type[3]), Matrix<Type>(n)  
  83.        {RGB[0]=R; RGB[1]=G; RGB[2]=B;}
  84. BASE(const BASE& B) { Copy(B); }  
  85. void Copy(const BASE& B) {  
  86.            Copy(B.M);   
  87.            if(B.RGB){  
  88.               if(!RGB) RGB=new Type[3];
  89.                 RGB[0]=B.RGB[0];
  90.                 RGB[1]=B.RGB[1];  
  91.                 RGB[2]=B.RGB[2];
  92.            }  
  93.        }
  94. ~BASE() { if(RGB) delete[] RGB; }
  95. };
  96. /*************************************************************************************************/
  97. void main(){
  98. Matrix<unsigned> M1(10);
  99. Matrix<unsigned> M2(M1);
  100. BASE<unsigned> B1(10);   
  101. // BASE<unsigned> B2(B1);    cause une erreur!*
  102. }


*error C2664: 'Copy' : cannot convert parameter 1 from 'unsigned int **const  ' to 'const class BASE<unsigned int> &'
        Reason: cannot convert from 'unsigned int **const  ' to 'const class BASE<unsigned int>'

 
J'ai pourtant surchargé mon opérateur de copie dans la class Matrix :??:


Message édité par peak le 31-01-2003 à 12:54:16
mood
Publicité
Posté le 31-01-2003 à 12:47:05  profilanswer
 

n°297837
gloop
Posté le 31-01-2003 à 12:55:42  profilanswer
 

Code :
  1. BASE(const BASE& B) : Matrix ((const Matrix&)B) { Copy(B); } 
  2.      void Copy(const BASE& B) { if(B.RGB){ if(!RGB) RGB=new Type[3]; RGB[0]=B.RGB[0];


 
t'appelles le constructeur pas copie de ta base et ensuite tu t'occupes de la partie concernant ta classe fille.
En + tu essaies d'utiliser un Copy prenant un  Type** mais t'en as pas

n°297845
peak
Posté le 31-01-2003 à 13:04:00  profilanswer
 

Code :
  1. void Copy(const BASE& B) Copy(B.M); //ici j'appel comme même bien la foncton Copy de matrix non?
  2. BASE(const BASE& B) : Matrix ((const Matrix&)B) { Copy(B); } //je svai pas ke ça marchait comme ça  ;)


 
 :jap:

n°297852
peak
Posté le 31-01-2003 à 13:08:52  profilanswer
 

yep!! ça marche!!
MERCI
 
(j'ai juste encore apparement un tit prob a la destruction mais ça devrai etre arrangable)

n°297867
peak
Posté le 31-01-2003 à 13:30:13  profilanswer
 

Code :
  1. ~BASE() { if(RGB) delete[] RGB; }


pk est ce ke mon destrusteur cause une violoation d'acces memoire??

n°297877
Fullblaste​r
Posté le 31-01-2003 à 13:36:45  profilanswer
 

Avec un RGB=NULL ds les constructeurs ca evitera de delete quand il existe pas

n°297884
peak
Posté le 31-01-2003 à 13:39:52  profilanswer
 

;)  
exact!!
Merci

n°298208
peak
Posté le 31-01-2003 à 19:20:48  profilanswer
 

imaginons ke j'ai une BASE B et une Matrix Mat je voudrai faire B*=Mat de manier a ce ke juste "la partie" Matrix de B soit modifié  
Y'a-t-il moyen avec l'operator tel k'il est défini dans mon code??

n°298211
Taz
bisounours-codeur
Posté le 31-01-2003 à 19:29:13  profilanswer
 

je vois pas trop l'utilité de Copy? un constructeur de recopie et un operator= ca fait pas l'affaire?

n°298216
peak
Posté le 31-01-2003 à 19:33:48  profilanswer
 

ouais, c'est vrai ke c'est pas vraipment necessaire; c'est juste ke je trouvai pratique de fair une seul fonction ke j'appel ensuite dans les 2autres...

mood
Publicité
Posté le 31-01-2003 à 19:33:48  profilanswer
 

n°298220
Taz
bisounours-codeur
Posté le 31-01-2003 à 19:43:22  profilanswer
 

ben sémantiquement, c'est le role du constructeur par recopie de te donner une copie...., apres tout gravite autour de lui (affectation, swap, etc)

n°298445
peak
Posté le 31-01-2003 à 23:14:18  profilanswer
 

ouais, t'as sans doute raison mais c'est une habitude (en general je fait la même chose avec une fct Erase()), soit, ça reste un detail d'implementation.... je voudrait surtout savoir si je suis obligé de surcharger mon operateur *= pour faire B*=Mat ou si Denis Ritchie a comme d'hab pensé à tout??

n°298656
Musaran
Cerveaulté
Posté le 01-02-2003 à 06:00:12  profilanswer
 

Peak a écrit a écrit :

imaginons ke j'ai une BASE B et une Matrix Mat je voudrai faire B*=Mat de manier a ce ke juste "la partie" Matrix de B soit modifié  
Y'a-t-il moyen avec l'operator tel k'il est défini dans mon code??


Code :
  1. template <class Type>
  2. class BASE{
  3. Matrix<Type> Mat_;
  4. public:
  5. const BASE& operator *=(const Matrix<Type>& Mat){
  6.  B.Mat_*= Mat;
  7.  return *this;
  8. }
  9. };


Denis Ritchie s'occipait du C.
C'est Bjarne Stroustrup qu'il faut remercier (ou haïr) pour le C++.


Message édité par Musaran le 01-02-2003 à 06:00:59

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°298749
peak
Posté le 01-02-2003 à 12:57:16  profilanswer
 

mais dans mon code, BASE hérite de Matrix donc je n'ai pas de "nom" (Mat_) à la Matrix ki constitue ma BASE.
Dans mon code B.M est pointeur de pointeur pas Matrix.
Bon j'avoue ke un heritage étai peu être pas necessaire dans mon cas mais bon j'avai jamais vraiment utilisé d'heritage et me suis dis ke ça me ferai pas de mal....
En fait c'est d'autant plus marrant ke sans definir aucun operateur dans Base je peux fair B1*=B2 et c'est unikement ça partie Matrix ki en est modifié; j'ai provisoirement resolu le prob comme ça mais j'aimerai quand même évité de declaré systématikement des BASE alors ke je fait de multiples operations sur des Matrix ke je fini seulement par combiner à une BASE.


Message édité par peak le 01-02-2003 à 12:59:09
n°299283
Musaran
Cerveaulté
Posté le 02-02-2003 à 04:36:10  profilanswer
 

Citation :

mais j'aimerai quand même évité de declaré systématikement des BASE alors ke je fait de multiples operations sur des Matrix ke je fini seulement par combiner à une BASE.

Qu'est-ce qui t'en empêche ?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°299546
peak
Posté le 02-02-2003 à 19:15:48  profilanswer
 

ke justement je n'arrive pas a faire B*=Mat

n°299816
Musaran
Cerveaulté
Posté le 03-02-2003 à 09:41:02  profilanswer
 

Code :
  1. Matrix<unsigned> M1(10);
  2. BASE<unsigned> B1(10);
  3. B1*=M1;

Chez moi ça marche©.
 
Montre le code et le message d'erreur.
 
À tout hasard:

Code :
  1. template<class Type>
  2. class BASE: public Matrix<Type>{
  3. public:
  4. using Matrix<Type>::operator *=;


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°300395
peak
Posté le 03-02-2003 à 19:17:02  profilanswer
 

:whistle:  
Alors là franchement désolé, je comprend vraiment pas se ke j'ai foutu?  :sweat:  :sweat:  :sweat:  
Je lis le post me dis "mais comment sa peux marcher chez lui et pas chez moi"  
Je retest chez moi et pouf ça marche j'y comprend vraiment rien.
Je suis absolument certain ke ça ne marchait pas y'a 3jours j'ai testé une dizaine de fois :heink:  
(j'ai sens doute changé un truc ke j'aurai pas du entre temps....)
 
mieux vaut ça ke le contraire :D  
 
Merci à toi ho MUSARAN!
et a tous les autres ki mon aidé dans ce topic!!
 
 :bounce:


Message édité par peak le 03-02-2003 à 19:18:04

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

  probleme d'heritage

 

Sujets relatifs
[C, Allegro] Problème avec bitmaps !!problème de version vba excel (97 et 2002)
[FORUM] Problème avec mon forum PHP bbProblème avec GD
[[Java]] -- Un gros probleme entre méthodes.[oracle] problème d'installation Oracle8i + questions de newbie
Probleme avec forum phpbb ?Un petit probleme de syntaxe ... .LinkedCell
probleme de cast dynamique avec heritage etcProblème d'héritage
Plus de sujets relatifs à : probleme d'heritage


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