[C++] const / redéfinir un attribut d'une classe

const / redéfinir un attribut d'une classe [C++] - C++ - Programmation

Marsh Posté le 14-01-2006 à 14:18:41    

Bonjour,
J'ai un petit problème qui est le suivant :
 
j'ai une classe A et une classe B dérivant de ma classe A
 

Code :
  1. class A
  2. {
  3. private:
  4.    const int a;
  5. public:
  6.    A():a(0){}
  7.    getVal() const {return a;}
  8. }
  9. class B : public A
  10. {
  11. private:
  12.    int a;
  13. public:
  14.    B():A(),a(0){}
  15.    setValeur(int _a) {a = _a;}
  16. }


 
Le but est d'ajouter des methodes à la classe A pour pouvoir modifier ses attributs (ici un simple setValeur...)
Le problème est que si j'essaye de construire un B, que je modifie sa valeur (2 par exemple) et que j'essaye de la relire il me renvoi 0 !!!
En fait quand je construit un B, il y a construction d'un A et du champ a de B... en clair il y a deux champs "a", l'un est const et l'autre non.
(j'espère que vous suivez lol :)) donc en fait après je modifie la valeur du champ "a" qui est non const et je lis la valeur du champ a qui est const et donc égale à 0.
Quand je défini le constructeur de B, je suis obligé d'appeler celui de A donc je suis bloqué ! cet héritage nous est imposé et il n'est pas possible de supprimer les const...
La seule solution que j'ai trouvée mais qui n'est pas propre est de redéfinir toutes les méthodes de A dans la classe B mais n'y a t'il pas une meilleure solution ?
Merci d'avance ;)

Reply

Marsh Posté le 14-01-2006 à 14:18:41   

Reply

Marsh Posté le 14-01-2006 à 14:37:21    

ben de n'avoir qu'un seul a (et pas const). ou bien d'avoir juste une interface  
 

Code :
  1. class Valeur {
  2.   public :
  3.   virtual void set(int nouvelle) = 0;
  4.   virtual int get() const =0;
  5.   virtual ~Valeur();
  6. };

Reply

Marsh Posté le 14-01-2006 à 15:09:37    

Merci pour ta réponse,
En fait dans le projet qu'on doit réaliser on nous a demandé de redéfinir une classe liste utilisant des itérateurs desssus (sans utiliser la STL) et on doit définir un itérateur en lecture seule (qui ne devra donc pas modifier la liste) et un itérateur en lecture et écriture qui dérive du précédant.
Le 1er sert pour lire les listes non modifiables (définies comme constantes) ce que ne peut pas faire le second.
 
Bref tout ça pour dire qu'on est obligé d'avoir une donnée const et l'autre non constante. (a et j'aoubliais et on ne doit pas non plus utiliser const_cast...)
C'est vrai que c'est un peu bizarre mais c'est imposé par mon prof.
 
Pour l'interface c'est une très bonne idée :-) .... mais malheureusement on nous impose d'utiliser l'héritage que j'ai détaillé au dessus :'(

Reply

Marsh Posté le 14-01-2006 à 15:46:26    

mon oeil ...
 

Code :
  1. #
  2. class A
  3. #
  4. {
  5. #
  6. private:
  7. #
  8.   const int a;
  9. #
  10. public:
  11. #
  12.   A():a(0){}
  13. #
  14.   getVal() const {return a;}
  15. #
  16. }


 
tu ne pourras jamais rien faire avec ça.

Reply

Marsh Posté le 14-01-2006 à 17:49:01    

arf ben je vais quand même devoir modifier des trucs alors. Mais je te ment pas en disant qu'on nous a imposé cette structure...
Enfin, merci quand même pour tes conseils :)

Reply

Sujets relatifs:

Leave a Replay

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