héritage et méthodes virtuelles ?

héritage et méthodes virtuelles ? - C++ - Programmation

Marsh Posté le 08-12-2007 à 11:54:30    

Bonjour,
 
J'ai un problème concernant l'héritage.  
En effet, je désire avoir une classe GEometric Shape virtuelle et 2 sous classes Ellipse et Polygon.  
 
J'ai crée cette classe virtuelle pour pouvoir utiliser ce type générique par ailleurs. par exemple j'aimerai pouvoir avoir un vecteur de GeometricShape dans une autre classe.  
 
Voici le code de mes classes :  
 
Classe GeometricShape :  

Code :
  1. #ifndef GEOMETRICSHAPE_HPP_
  2. #define GEOMETRICSHAPE_HPP_
  3. #include "Point.h"
  4. #include <vector>
  5. using namespace std;
  6. namespace sys{
  7. class GeometricShape
  8. {
  9. public:
  10. GeometricShape();
  11. GeometricShape(const GeometricShape& gs){};
  12. GeometricShape& operator=(const GeometricShape& gs){} ;
  13. virtual vector<Point*> getPointsList() const = 0 ;
  14. virtual void setPointsList(vector<Point*> vec) = 0 ;
  15. virtual ~GeometricShape(){};
  16. };
  17. }
  18. #endif


 
 
Classe Polygon :  

Code :
  1. #ifndef POLYGON_HPP_
  2. #define POLYGON_HPP_
  3. #include "GeometricShape.h"
  4. using namespace std;
  5. namespace sys{
  6. class Polygon : public GeometricShape
  7. {
  8. public:
  9. Polygon(void);
  10. Polygon(const Polygon& p);
  11. Polygon(vector<Point*> vec);
  12. Polygon& operator=(const Polygon& p);
  13. ~Polygon(void);
  14. void add(Point* p);
  15. Point& operator[](const int i);
  16. int getNbPoints() const;
  17. vector<Point*> getPointsList() const;
  18. void setPointsList(vector<Point*> vec);
  19. private :
  20. vector<Point*> _pointsList;
  21. };
  22. }
  23. #endif


 
 
Classe Ellipse :  

Code :
  1. #ifndef ELLIPSE_HPP_
  2. #define ELLIPSE_HPP_
  3. #include "GeometricShape.h"
  4. namespace sys{
  5. class Ellipse : public GeometricShape {
  6. public:
  7. Ellipse(void);
  8. Ellipse(Point* center, Point* width, Point* height);
  9. Ellipse(Point* center, Point* radius); // only for a center
  10. Ellipse(const Ellipse& ellipse);
  11. Ellipse& operator=(const Ellipse& e);
  12. ~Ellipse(void);
  13. Point* getWidth();
  14. Point* getHeight();
  15. Point* getCenter();
  16. vector<Point*> getPointsList() const;
  17. void setPointsList(vector<Point*> vec);
  18. private :
  19. Point* _center;
  20. Point* _width; // largeur
  21. Point* _height; // hauteur
  22. };
  23. }
  24. #endif


 
 
Quand je veux utiliser un attribut Geometric Shape dans une autre classe,  j'ai l'erreur suivante :  
 
Object.h:18: error: cannot declare parameter `pos' to be of type `sys::Geometric
Shape'
Object.h:18: error:   because the following virtual functions are abstract:
GeometricShape.h:17: error:  virtual void sys::GeometricShape::setPointsList(std
::vector<sys:: Point*, std::allocator<sys:: Point*> > )
 
 
 
extrait de ma classe Object :  

Code :
  1. class Object {
  2. ....
  3. protected :
  4. int _id;
  5. GeometricShape _position;
  6. };

Reply

Marsh Posté le 08-12-2007 à 11:54:30   

Reply

Marsh Posté le 08-12-2007 à 13:27:29    

Salut,
 
Les classes virtuelles abstraites ne peuvent s'utiliser que par un pointeur, et lors de leur création, tu ne peux créer qu'une de leur classes dérivées.

Reply

Marsh Posté le 08-12-2007 à 13:31:25    

IrmatDen a écrit :

Salut,
Les classes virtuelles abstraites ne peuvent s'utiliser que par un pointeur


... ou par une reference.
 

Reply

Marsh Posté le 08-12-2007 à 17:04:07    

void setPointsList(vector<Point*> &vec) peut pas faire de mal.
 
par contre tes:
GeometricShape();
GeometricShape(const GeometricShape& gs){};
GeometricShape& operator=(const GeometricShape& gs){} ;
 
n'ont pas de sens, il vaut mieux un:
vitrual GeometricShape *clone() = 0;

Reply

Marsh Posté le 08-12-2007 à 22:06:00    

les ; :o
Mais effectivement, ça sert à rien de les définir ici, surtout comme ça.

Reply

Marsh Posté le 09-12-2007 à 09:23:13    

Un destructeur virtuel ça peut être bien aussi non ?
Je sais pas ce qu'il y a au niveau de GeometricShape mais je pense que ça peut pas faire de mal...

Reply

Marsh Posté le 09-12-2007 à 11:34:10    

Amonchakai a écrit :

Un destructeur virtuel ça peut être bien aussi non ?
Je sais pas ce qu'il y a au niveau de GeometricShape mais je pense que ça peut pas faire de mal...


il y est le destructeur virtuel au niveau de GeometricShape. Je ne vois pas ce que tu veux dire...

Reply

Marsh Posté le 09-12-2007 à 14:02:15    

ha oui, pardon j'avais mal lu...
Par contre j'aurai aussi mis virtuel le destructeur d'Ellipse

Reply

Sujets relatifs:

Leave a Replay

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