[C++] Pb de conception - classes abstraites

Pb de conception - classes abstraites [C++] - C++ - Programmation

Marsh Posté le 22-05-2003 à 11:02:44    

Et hop! Question du jour!
 
Voilà le pb qui se pose à moi ce matin:
Comme certains ont pu le remarquer, je développe depuis quelques semaines un outil manipulant des images, qui jusqu'alors n'utilisait qu'une classe image toute bête.
 
Hors il se trouve que je suis amené à découper ces images en sous-images, lesquelles ne sont finalement que des coordonnées dans l'image de départ, puisqu'elles ne modifiet pas le contenu.
 
Je me suis donc dit que je devrais p-e diviser ca en 3 classes:
1) Une classe image de base, abstraite, ne contenant pas de données mais implémentant certaines fonctions via des accesseurs virtuels.
2) Une classe d'image contenant réellement les données, ainsi qu'une liste de sous-images.
3) Une classe de sous-image, qui ne contiendrait que ses coordonnées et un pointeur vers l'image de départ (ou directement les données).
 
J'ai donc dans ma classe mère ces déclarations:

Code :
  1. class CImage{
  2. [...]
  3. inline BYTE getVal(int x, int y){return this->getVal(x + y * m_length);};
  4. virtual BYTE getVal(int i)=0;
  5. virtual BYTE * getVal()=0;
  6. };


 
Dans ma classe fille contenant les données j'ai l'implémentation des fonctions virtuelles:

Code :
  1. class CMainImage : public CImage{
  2. [...]
  3. BYTE * m_val;
  4. [...]
  5. inline BYTE getVal(int i){return m_val[i];};
  6. inline BYTE * getVal(){return m_val;};
  7. };


 
Ma question porte donc sur la 3ème fonction de la classe mère. En effet, si j'essaie de l'utiliser directement dans une méthode, dans le style :

Code :
  1. BYTE valeur = this->getVal(x, y);


le compilateur me fait savoir qu'il ne connait pas de fonction de ce genre...
J'ai donc ajouté la déclaration dans la classe fille, puis l'ai implémentée par:

Code :
  1. return this->CImage::getVal(x,y);


Ceci compile, mais ca me parait plutot bancal...est-ce correct?
L'architecture vous parait-elle correcte?
Je suis ouvert à toute proposition...


Message édité par skeye le 22-05-2003 à 13:23:35
Reply

Marsh Posté le 22-05-2003 à 11:02:44   

Reply

Marsh Posté le 22-05-2003 à 12:59:13    

skeye a écrit :

Code :
  1. return this->CImage::getVal(x,y);




 
Ben ... Tu fais un appel concret à une fonction purement virtuelle, ca m'étonnerait que ca passe ...


---------------
last.fm
Reply

Marsh Posté le 22-05-2003 à 13:01:07    

theShOcKwAvE a écrit :


 
Ben ... Tu fais un appel concret à une fonction purement virtuelle, ca m'étonnerait que ca passe ...


bah alors on fait comment un truc de ce genre...ca existe pas?
J'ai beau regarder le cours de christian casteyde je vois qui ressemble à ca...:/

Reply

Marsh Posté le 22-05-2003 à 13:05:38    

skeye a écrit :


bah alors on fait comment un truc de ce genre...ca existe pas?
J'ai beau regarder le cours de christian casteyde je vois qui ressemble à ca...:/


 
oups ... Autant pour moi, j'ai lu un peu vite ... Non, ta fonction n'est pas virtuelle pure !
 
Edit : (normalement, ca devrait passer, ca ....)


Message édité par theshockwave le 22-05-2003 à 13:07:10

---------------
last.fm
Reply

Marsh Posté le 22-05-2003 à 13:06:09    

Citation :

le compilateur me fait savoir qu'il ne connait pas de fonction de ce genre...


 
tu peux balancer l'erreur qu'il te donne ?

Reply

Marsh Posté le 22-05-2003 à 13:13:44    

theShOcKwAvE a écrit :


 
oups ... Autant pour moi, j'ai lu un peu vite ... Non, ta fonction n'est pas virtuelle pure !
 
Edit : (normalement, ca devrait passer, ca ....)


Ca me rassure...

Reply

Marsh Posté le 22-05-2003 à 13:14:59    

chrisbk a écrit :

Citation :

le compilateur me fait savoir qu'il ne connait pas de fonction de ce genre...


 
tu peux balancer l'erreur qu'il te donne ?



error C2661: 'getVal' : no overloaded function takes 2 parameters


Reply

Marsh Posté le 22-05-2003 à 13:16:53    

skeye a écrit :



error C2661: 'getVal' : no overloaded function takes 2 parameters


 


 
:heink:
etrange ton souc
tu peux balancer le code entier de la fonction utilisant ce getval ? (enfin, entete surtout), la je vois pas trop

Reply

Marsh Posté le 22-05-2003 à 13:17:13    

Ca m'intéresse, quand même, tout ça...Il y a des cours plus complets que celui de christian casteyde sur ce genre de pbs?
J'ai eu une illumination il y a quelques minutes, donc je suis de nouveau en train de tout repenser, mais je sais que mes connaissances sont parfois un peu floues dans ce domaine...

Reply

Marsh Posté le 22-05-2003 à 13:18:43    

chrisbk a écrit :


 
:heink:
etrange ton souc
tu peux balancer le code entier de la fonction utilisant ce getval ? (enfin, entete surtout), la je vois pas trop  


 

Code :
  1. float CMainImage::autoRotate90()
  2. {
  3. [bla bla bla...]
  4. for(i = 0; i < this->getLength(); i++)
  5.     {
  6.  for(int j = 0; j <  this->getHeight(); j++)
  7.  {
  8.   if(this->getVal(i, j) == 0)
  9.   {
  10.    nbPixCol[i]++;
  11.    nbPixLin[j]++;
  12.    moyX++;
  13.   }
  14.  }
  15.     }
  16. [blablabla...]


Ca suffit?

Reply

Marsh Posté le 22-05-2003 à 13:18:43   

Reply

Marsh Posté le 22-05-2003 à 13:19:16    

perso ton implementation me fait comme peur, principalement ton getVal(int x,int y). laisse tber le inline et passe cette fonction en virtuel, sinon ton calcul d'indice risque d'etre faussé (enfin vu comme je vois ca)

Reply

Marsh Posté le 22-05-2003 à 13:20:13    

RAHHHHHHHHH
 

Code :
  1. class CMainImage{


 
 
et la derivation (et  me faite pas chier si c pas francais :D) alors hein ?? [:toad666]


Message édité par chrisbk le 22-05-2003 à 13:20:40
Reply

Marsh Posté le 22-05-2003 à 13:20:54    

chrisbk a écrit :

perso ton implementation me fait comme peur, principalement ton getVal(int x,int y). laisse tber le inline et passe cette fonction en virtuel, sinon ton calcul d'indice risque d'etre faussé (enfin vu comme je vois ca)
 


Je compte bien virer tout ca, de tte façon, puisque je change tout...
Mais il n'empêche que cette erreur m'interpelle!:D

Reply

Marsh Posté le 22-05-2003 à 13:21:26    

chrisbk a écrit :

RAHHHHHHHHH
 

Code :
  1. class CMainImage{


 
 
et la derivation (et  me faite pas chier si c pas francais :D) alors hein ?? [:toad666]


Elle y est dans le vrai source...j'ai juste mal copié...

Reply

Marsh Posté le 22-05-2003 à 13:22:04    

skeye a écrit :


Elle y est dans le vrai source...j'ai juste mal copié...


 
ben on est bien pour t'aider si tu nous file du faux source code tiens :D

Reply

Marsh Posté le 22-05-2003 à 13:22:59    

chrisbk a écrit :


 
ben on est bien pour t'aider si tu nous file du faux source code tiens :D


 :pfff:  
j'édite, si tu veux... :ange:

Reply

Marsh Posté le 22-05-2003 à 13:23:51    

skeye a écrit :


 :pfff:  
j'édite, si tu veux... :ange:  


 
ben balance un CC de la declaration de tes classes (en virant l'inutile) paske bon, c tordu ton erreur la

Reply

Marsh Posté le 22-05-2003 à 13:28:08    

chrisbk a écrit :


 
ben balance un CC de la declaration de tes classes (en virant l'inutile) paske bon, c tordu ton erreur la


 
classe mère:

Code :
  1. class CImage 
  2. {
  3. public:
  4. CImage();
  5. virtual ~CImage();
  6. virtual BYTE getVal(int i)=0;
  7. virtual BYTE * getVal()=0;
  8. virtual void setVal(BYTE * values)=0;
  9. virtual void setVal(int i, BYTE value)=0;
  10. public:
  11. inline BYTE getVal(int x, int y){return this->getVal(x + y * m_length);};
  12. inline void setVal(int x, int y, BYTE value){this->setVal(x + y * m_length, value);};
  13. inline int getLength(){return m_length;};
  14. inline int getHeight(){return m_height;};
  15. inline int getSize(){return m_length * m_height;};
  16. inline void setHeight(int height){m_height = height;};
  17. inline void setLength(int length){m_length = length;};
  18. inline BYTE getMax(){return m_max;};
  19. inline void setMax(BYTE max){m_max = max;};
  20. private:
  21. int m_length;
  22. int m_height;
  23. BYTE m_max;
  24. };


 
Classe fille:

Code :
  1. class CMainImage : public CImage 
  2. {
  3. public:
  4. CMainImage();
  5. virtual ~CMainImage();
  6. inline BYTE getVal(int i){return m_val[i];};
  7. inline BYTE * getVal(){return m_val;};
  8. inline void setVal(BYTE * values){m_val = values;};
  9. inline void setVal(int i, BYTE value){m_val[i] = value;};
  10. BYTE * m_val;
  11. };


 
Voilà, sans les trucs inutiles...

Reply

Marsh Posté le 22-05-2003 à 13:29:26    

chrisbk a écrit :

perso ton implementation me fait comme peur, principalement ton getVal(int x,int y). laisse tber le inline et passe cette fonction en virtuel, sinon ton calcul d'indice risque d'etre faussé (enfin vu comme je vois ca)


 
+1 ... Parfois, je me demande si le compilo n'inline pas les fonctions un peu trop vite ... (exemple : ne jamais faire un pointeur sur une fonction inline ! :D le compilo, il ne voit pas ca et l'inline malgré tout !)


---------------
last.fm
Reply

Marsh Posté le 22-05-2003 à 13:41:40    

Finalement, je crois que je vais retourner à ma classe toute seule...
1 image =
* 1 tableau de BYTE
* Une taille en X et Y
* Les coordonnées du point en haut à gauche dans le tableau.
* les brols dont vous avez rien à f... mais quui peuvent me servir...
 
En fait ce type de fonctionnement pourra me faire économiser des recopies / allocations / désallocation de tableaux...Pour une image de départ je n'aurai qu'un tableau de BYTE (à moins d'avoir à y faire des traitements complexes), pi voilà...
 
Ca peut pas être une mauvaise chose de pas faire des recopies sur des images qui peuvent être des plan A0 scannés, à la base...

Reply

Sujets relatifs:

Leave a Replay

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