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

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Pb de conception - classes abstraites

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Pb de conception - classes abstraites

n°403920
skeye
Posté le 22-05-2003 à 11:02:44  profilanswer
 

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
mood
Publicité
Posté le 22-05-2003 à 11:02:44  profilanswer
 

n°404116
theshockwa​ve
I work at a firm named Koslow
Posté le 22-05-2003 à 12:59:13  profilanswer
 

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
n°404119
skeye
Posté le 22-05-2003 à 13:01:07  profilanswer
 

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...:/

n°404122
theshockwa​ve
I work at a firm named Koslow
Posté le 22-05-2003 à 13:05:38  profilanswer
 

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
n°404123
chrisbk
-
Posté le 22-05-2003 à 13:06:09  profilanswer
 

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 ?

n°404131
skeye
Posté le 22-05-2003 à 13:13:44  profilanswer
 

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

n°404134
skeye
Posté le 22-05-2003 à 13:14:59  profilanswer
 

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


n°404135
chrisbk
-
Posté le 22-05-2003 à 13:16:53  profilanswer
 

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

n°404136
skeye
Posté le 22-05-2003 à 13:17:13  profilanswer
 

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

n°404138
skeye
Posté le 22-05-2003 à 13:18:43  profilanswer
 

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?

mood
Publicité
Posté le 22-05-2003 à 13:18:43  profilanswer
 

n°404139
chrisbk
-
Posté le 22-05-2003 à 13:19:16  profilanswer
 

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)

n°404141
chrisbk
-
Posté le 22-05-2003 à 13:20:13  profilanswer
 

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
n°404143
skeye
Posté le 22-05-2003 à 13:20:54  profilanswer
 

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

n°404145
skeye
Posté le 22-05-2003 à 13:21:26  profilanswer
 

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

n°404148
chrisbk
-
Posté le 22-05-2003 à 13:22:04  profilanswer
 

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

n°404149
skeye
Posté le 22-05-2003 à 13:22:59  profilanswer
 

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:

n°404153
chrisbk
-
Posté le 22-05-2003 à 13:23:51  profilanswer
 

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

n°404160
skeye
Posté le 22-05-2003 à 13:28:08  profilanswer
 

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

n°404164
theshockwa​ve
I work at a firm named Koslow
Posté le 22-05-2003 à 13:29:26  profilanswer
 

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
n°404197
skeye
Posté le 22-05-2003 à 13:41:40  profilanswer
 

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


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

  [C++] Pb de conception - classes abstraites

 

Sujets relatifs
[JAVA] afficher une liste de noms de classes[C++] Problème de classes
[JAVA] Problème de conception[C++]->[DELPHI] Classes
Objecteering UML Modeler : Utilisation des classes[c++] Heritage de classes
[opengl et c++]comment utiliser les classes avec l'open glquestion sur conception objet
Visibilite des classes MFCConception Modele 3d réseauté en temps réel
Plus de sujets relatifs à : [C++] Pb de conception - classes abstraites


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