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

  FORUM HardWare.fr
  Programmation
  C++

  Probleme heritage/surcharge d'operateur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme heritage/surcharge d'operateur

n°635809
Sylfurd
UUUURUTORAMAN §§
Posté le 09-02-2004 à 12:20:34  profilanswer
 

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:

mood
Publicité
Posté le 09-02-2004 à 12:20:34  profilanswer
 

n°635817
chrisbk
-
Posté le 09-02-2004 à 12:25:17  profilanswer
 

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

n°635819
chrisbk
-
Posté le 09-02-2004 à 12:25:41  profilanswer
 

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

n°635821
Sylfurd
UUUURUTORAMAN §§
Posté le 09-02-2004 à 12:28:32  profilanswer
 

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
n°635833
Taz
bisounours-codeur
Posté le 09-02-2004 à 12:46:27  profilanswer
 

et le destructeur virtuel :o

n°635856
blackgodde​ss
vive le troll !
Posté le 09-02-2004 à 13:03:56  profilanswer
 

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


---------------
-( BlackGoddess )-
n°635871
Taz
bisounours-codeur
Posté le 09-02-2004 à 13:09:43  profilanswer
 

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 ?

n°635902
blackgodde​ss
vive le troll !
Posté le 09-02-2004 à 13:21:54  profilanswer
 

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


---------------
-( BlackGoddess )-
n°635904
Taz
bisounours-codeur
Posté le 09-02-2004 à 13:22:27  profilanswer
 

donc ça n'existe pas

n°635912
blackgodde​ss
vive le troll !
Posté le 09-02-2004 à 13:25:59  profilanswer
 

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 )-
mood
Publicité
Posté le 09-02-2004 à 13:25:59  profilanswer
 

n°635951
Taz
bisounours-codeur
Posté le 09-02-2004 à 13:51:37  profilanswer
 

ben dans le premier, s est abstraite

n°635953
blackgodde​ss
vive le troll !
Posté le 09-02-2004 à 13:56:06  profilanswer
 

ah oui exact, merci :jap:


---------------
-( BlackGoddess )-
n°636218
blackgodde​ss
vive le troll !
Posté le 09-02-2004 à 17:03:23  profilanswer
 

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


---------------
-( BlackGoddess )-
n°636233
Taz
bisounours-codeur
Posté le 09-02-2004 à 17:12:23  profilanswer
 

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)

n°636242
blackgodde​ss
vive le troll !
Posté le 09-02-2004 à 17:23:45  profilanswer
 

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 )-
n°636248
Taz
bisounours-codeur
Posté le 09-02-2004 à 17:28:58  profilanswer
 

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.


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

  Probleme heritage/surcharge d'operateur

 

Sujets relatifs
problème conversion Chaine->hexaProbleme sql (configuration)
Direct Sound : probleme de lectureProblème de sockets ouverts
Petit probleme (apres compilation)problème d'antislash à la création d'un fichier via un fichier php
problème de compilation(scite)problème avec les library VBa access 2000
Problème de maths[VBS] WshShell - Problème d'initialisation des var. d'environment
Plus de sujets relatifs à : Probleme heritage/surcharge d'operateur


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