Probleme heritage/surcharge d'operateur

Probleme heritage/surcharge d'operateur - C++ - Programmation

Marsh Posté le 09-02-2004 à 12:20:34    

Bon voila, j'ai un probleme que je n'arrive absolument pas à comprendre.... Je souhaite gérer des vertices (points) et des vecteurs en 3D... Mon probleme se situe sur une surcharge de l'operateur - pour les vertices qui devrait renvoyer un vecteur:
 
Tout d'abord j'ai une classe Point3D ne contenant que les 3 coordonnées X, Y et Z:
 

Code :
  1. class Point3D
  2. {
  3.   protected:
  4.     float X,Y,Z;
  5.   public:
  6.     Point3D(float x=0, float y=0, float z=0):
  7.       X(x), Y(y), Z(z){}
  8.     float get_X(){return X;}
  9.     float get_Y(){return Y;}
  10.     float get_Z(){return Z;}
  11. };


 
J'ai ensuite 2 classes Vertex (un vertex, des vertices) et Vector qui dérivent tout deux de la classe Point3D:
 

Code :
  1. class Vector: public Point3D
  2. {
  3.   public:
  4.    Vector(float x=0, float y=0, float z=0):Point3D(x, y, z){}
  5. };
  6. class Vertex: public Point3D
  7. {
  8.   public:
  9.    Vertex(float x=0, float y=0, float z=0):Point3D(x, y, z){}
  10.    Vector operator-(const Vertex& ) const;
  11. };


 
Et là la définition de la méthode de surcharge de l'opérateur - :

Code :
  1. Vector Vertex::operator-(const Vertex& v2) const
  2. {
  3.   cout << v2.get_X() << " ";
  4.   Vector vv(1,2,3); // ne tenez pas compte de ces 2 dernieres lignes
  5.   return vv;
  6. }


 
En fait le problème vient du v2.get_X() que le compilateur n'aime pas du tout (j'utilise Dev-C++ qui utilise lui meme gcc) et qui me dit: passing `const Vertex' as `this' argument of `float  
   Vertex::get_X()' discards qualifiers
 
Apparement c'est le passage par référence constante qu'il n'aime pas, si je mets un passage normal ça semble fonctionner, mais je ne comprends absolument pas pourquoi :\
 
Si vous pouviez m'éclairer ce serait sympa  :jap:

Reply

Marsh Posté le 09-02-2004 à 12:20:34   

Reply

Marsh Posté le 09-02-2004 à 12:25:17    

ben ton get_X n'est pas marqué comme etant const

Reply

Marsh Posté le 09-02-2004 à 12:25:41    

float get_X() const {return X;}
float get_Y() const {return Y;}
float get_Z() const {return Z;}  

Reply

Marsh Posté le 09-02-2004 à 12:28:32    

Au purée, le boulay   :pt1cable:  
Merci beaucoup Chrisbk ca fonctionne  :jap: je ne pensait pas du tout à ça! Maintenant je ferait moins d'erreur de déclaration de méthode constantes grâce à toi  :)


Message édité par Sylfurd le 09-02-2004 à 12:31:58
Reply

Marsh Posté le 09-02-2004 à 12:46:27    

et le destructeur virtuel :o

Reply

Marsh Posté le 09-02-2004 à 13:03:56    

on doit le mettre même s'il est trivial ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 09-02-2004 à 13:09:43    

ben le virtuel est pas le mode par défaut alors oui, il faut l'écrire. et je vous vois venir avec vos destructeurs virtuels pures ... qui saurait dire pourquoi ça marche pas ?

Reply

Marsh Posté le 09-02-2004 à 13:21:54    

bin un destructeur virtuel pure doit qd mm être défini
 
(d'ailleurs c un peu flou encore pour moi :p)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 09-02-2004 à 13:22:27    

donc ça n'existe pas

Reply

Marsh Posté le 09-02-2004 à 13:25:59    

mais quelle est la différence entre ces 2 écritures alors :
 

Code :
  1. struct s
  2. {
  3.   virtual ~s() = 0;
  4. };
  5. s::~s() {}


 
et  
 

Code :
  1. struct s
  2. {
  3.   virtual ~s() {}
  4. };


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 09-02-2004 à 13:25:59   

Reply

Marsh Posté le 09-02-2004 à 13:51:37    

ben dans le premier, s est abstraite

Reply

Marsh Posté le 09-02-2004 à 13:56:06    

ah oui exact, merci :jap:


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 09-02-2004 à 17:03:23    

pour une classe abstraite, le destructeur trivial virtuel est aussi indispensable ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 09-02-2004 à 17:12:23    

oui, par ce qu'un destructeur ne peut être conceptuellement virtuel pure puisque toute classe a entre autes un destructeur (non virtuel par défaut)

Reply

Marsh Posté le 09-02-2004 à 17:23:45    

rah c embetant ca ...
il y a une raison précise pour que l'absence de déclaration de desctructeur soit implicitement écrite par le compilo pour un destructeur trivial, plutot qu'un destructeur trivial virtuel ? :p


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 09-02-2004 à 17:28:58    

par ce que le C++ est basé sur un principe « on ne paie que pour ce qu'on utilise ».
la virtualité a un coup, insignifiant pour 99% des applications, mais C++ a été avant tout créé pour écrire des sytèmes d'exploitations et des programmes exigeants, donc ce n'est pas le comportement par défaut.

Reply

Sujets relatifs:

Leave a Replay

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