[C++][Débutant] Héritage et variables protected

Héritage et variables protected [C++][Débutant] - C++ - Programmation

Marsh Posté le 20-12-2004 à 13:33:28    

Bonjour à tous, j'ai un petit problème : je n'arrive pas à accéder depuis une classe B qui dérive d'une classe A aux variables protected de A. Pourtant vu ce que je lis partout ca me semble légal....
 
Qu'en est-il réellement ?
 
Voici le code qui ne compile pas :
Matrix.h

Code :
  1. class Matrix {
  2.      protected :
  3.          int nbLignes;
  4.          int nbColonnes;
  5.      public :
  6.          [...]
  7. }


 
SquareMatrix.h

Code :
  1. #include "Matrix.h"
  2. class SquareMatrix : public Matrix {
  3.     [...]


 
SquareMatrix.cpp

Code :
  1. #include "SquareMatrix.h"
  2. [...]
  3. // permet l'écriture : SquareMatrix s(m) avec m Matrix
  4. SquareMatrix::SquareMatrix(const Matrix& m) : Matrix(m) {
  5.     if (m.nbLignes != m.nbColonnes) {
  6.         throw DimensionException();
  7.     }
  8. }
  9. [...]


 
 
Et gcc dit :

Matrix.h|10| error: `int Matrix::nbLignes' is protected
SquareMatrix.cpp|15| error: within this context
Matrix.h|11| error: `int Matrix::nbColonnes' is protected
SquareMatrix.cpp|15| error: within this context


 
La ligne 10 de Matrix.h = le 'int nbLignes'
La ligne 15 de SquareMatrix.cpp = le 'if'
 
 
 
Merci d'avance pour votre aide  :hello:


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 20-12-2004 à 13:33:28   

Reply

Marsh Posté le 20-12-2004 à 13:37:39    

Oui c'est normal, regarde cette ligne :
 

Code :
  1. if (m.nbLignes != m.nbColonnes) {


 
Tu fais référence à nbLignes et nbColonnes de l'objet m, et non pas à nbLignes et nbColonnes de la class mère...

Reply

Marsh Posté le 20-12-2004 à 14:03:26    

Ben oui mais c'est ce que je veux faire quelque part... vérifier que l'objet m instance de la classe Matrix a des propriétés correctes. Si je crée des accesseurs public ca marchera je pense, mais je ne vois pas pourquoi je ne peux pas "lire" les champs protected de m directement....  :??:


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 20-12-2004 à 14:05:36    

Ben tu peux pas lire les champs protected, vu qu'ils sont protected. Même si tu hérites de Matrix, tu pourra pas lire les champs d'un object Matrix...
 
En fait, faut considérer les champs protected comme private. Sauf que la différence c'est qu'une classe dérivée pourra y accéder.

Reply

Marsh Posté le 20-12-2004 à 14:13:19    

Ok ! Donc les champs protected sont private pour la classe mère mais héritables ?
En gros ma classe SquareMatrix possède des champs "int nbLignes" et "int nbColonnes" par héritage des champs protected de Matrix, mais en aucun cas elle n'a le droit de faire un "m.nbLignes" (avec m Matrix) vu que même pour elle ces 2 champs apparaissent privés quand il s'agit de parler d'un objet instance de Matrix.
C'est bien ca ?
 
Parce que en lisant dans plusieurs doc "les membres protected ne sont accessibles que la classe elle-même et par toute les classes dérivées." ca ne me semblait pas clair :/
 
 
Bon ben en tout cas si c'est bien ca merci beaucoup, je vais faire des accesseurs alors ;)
 :jap:


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 20-12-2004 à 14:22:05    

tiens, c'est quoi ton compilo ?

Reply

Marsh Posté le 20-12-2004 à 14:23:47    

g++ (GCC) 3.3.4 20040623


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 20-12-2004 à 14:32:42    

Voilà en fait, quand tu hérites de Matrix, t'as besoin d'accéder à nbLignes et nbColonnes, donc tu les déclares protected. Donc dans SquareMatrix, tu peux y faire référence , et y faire tes calculs, etc.
 
Par contre, dans ta fonction, tu passe un objet de type Matrix. Tu peux pas y faire référence, parce que c'est un autre objet, différent de celui où tu te trouves.  
 
Donc ton objet Matrix se présente sous cette forme :
 

Code :
  1. ------------
  2. |Matrix    |
  3. ------------
  4. |nbLines   |
  5. |nbColonnes|
  6. ------------


 
Bien sûr, dans ton objet Matrix, tu peux pas faire référence aux variables private d'un autre objet Matrix, t'es bien d'accord ? Même si les deux objets sont du même type, ils ne peuvent faire références aux champs privés. Dans ton objets Matrix1, tu peux pas faire un Matrix2.nbLignes par exemple. Si t'as genre une méthode de comparaison qui ressemble à ça (je connais pas le C++, donc je tape ça dans un langage type Java) :
 

Code :
  1. bool function compare(Matrix2 m) {
  2. return (this.nbLigne == m.nbLignes && this.nbColonnes == m.nbColonnes);
  3. }


 
Là ça marchera pas. Pourquoi ? Parce qu'on ne peut pas accéder à nbLignes de m, parce qu'ils sont private. Même si on est dans un objet Matrix.
 
Même chose pour les classes héritées. Une seule différence. Si on reprend la fonction de comparaison. On voit qu'il y a un "this.nbLigne". Donc la variable nbLigne de notre objet. Jusqu'ici pas de problèmes. Maintenant quand on est dans un classes héritée, le private fait effet. Un "this.nbLignes" va pas marcher, vu qu'il est déclaré private, donc personne, même les classes héritées ne pourront y accéder. C'est pourquoi on les déclare en protected.
 
Mais protected veut quand-même dire "private" d'un point de vue extérieure. Il permet juste aux classes héritées d'accéder au membres de la classe mère.
 
En espérant que ça éclairci tout ;)

Reply

Marsh Posté le 20-12-2004 à 14:40:16    

Ca me semble clair, mais pourtant j'arrive à faire ca dans la classe Matrix :
 
// Construire une matrice à partir d'une autre matrice pour permettre l'écriture :
// Matrix m1 = m2    (avec m2 une Matrix)
Matrix::Matrix(const Matrix& m) {
    nbLignes = m.nbLignes;
    nbColonnes = m.nbColonnes;
    (*this).lignes = m.lignes;
}
 
 
Donc contrairement à ce que tu dis, depuis la classe Matrix je peux accéder aux champs protected d'un autre objet de la classe Matrix.... donc c'est pas si "private" que ca en fait les protected :??:


Message édité par Xavier_OM le 20-12-2004 à 14:40:58

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 20-12-2004 à 14:42:18    

Bizarre, ça devrait pas marcher...

Reply

Marsh Posté le 20-12-2004 à 14:42:18   

Reply

Marsh Posté le 20-12-2004 à 16:21:21    

les notions de private et protected s'appliquent au niveau des classes et non des instances ...  :pfff:

Reply

Marsh Posté le 20-12-2004 à 16:31:00    

Ben ça dépend de l'implémentation des langages, alors, non ?

Reply

Marsh Posté le 20-12-2004 à 16:33:49    

non :o
 
enfin, je dis ca, mais ici, c'est la cat C++, donc j'ai pas trop envie de vwerifier ... En c++, ce n'est pas le cas :p
 
public, prive et protected te permettent de definir la visibilite des methodes et attributs aux autres classes.

Reply

Marsh Posté le 20-12-2004 à 16:35:49    

bon et qui est capable d'expliquer pourquoi cette restriction précises sur protected existe ?

Reply

Marsh Posté le 20-12-2004 à 16:36:38    

theShOcKwAvE a écrit :

les notions de private et protected s'appliquent au niveau des classes et non des instances ...  :pfff:


rien à voir. Et c'est d'ailleurs faux.

Reply

Marsh Posté le 20-12-2004 à 16:37:50    

Pourtant je pensais que c'était valide pour les instances... Tiens, je viens de tester en .NET, ben t'as raison... Enfin je sais pas... C'est étrange...


Message édité par FlorentG le 20-12-2004 à 16:38:12
Reply

Marsh Posté le 20-12-2004 à 16:40:41    

Taz a écrit :

rien à voir. Et c'est d'ailleurs faux.


 
 :heink: explique, alors ...

Reply

Marsh Posté le 20-12-2004 à 16:41:13    

FlorentG a écrit :

Pourtant je pensais que c'était valide pour les instances... Tiens, je viens de tester en .NET, ben t'as raison... Enfin je sais pas... C'est étrange...


ben alors creuse toi un peu la tête sur pourquoi on a instauré cettre restriction sur l'accès aux membres protected d'instances :D
 
je suis sur que tu peux trouver un exemple

Reply

Marsh Posté le 20-12-2004 à 16:42:10    

theShOcKwAvE a écrit :

:heink: explique, alors ...

bah je vais pas cracher le morceau direct après un déballage de tant de certitudes. Faut le mériter

Reply

Marsh Posté le 20-12-2004 à 16:47:20    

Taz a écrit :

bon et qui est capable d'expliquer pourquoi cette restriction précises sur protected existe ?


Tu peux donner une piste ? C'est pas un problème d'invariant? Si cela était possible, il suffirait de dériver la classe de base disposant de membres protected pour casser l'invariant de n'importe quelle instance ?


Message édité par xterminhate le 20-12-2004 à 16:47:53

---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 20-12-2004 à 16:51:24    

xterminhate a écrit :

Tu peux donner une piste ? C'est pas un problème d'invariant? Si cela était possible, il suffirait de dériver la classe de base disposant de membres protected pour casser l'invariant de n'importe quelle instance ?


ben ouala, c'est tout con.

Reply

Marsh Posté le 20-12-2004 à 16:56:25    

et c'est apparu recemment ?

Reply

Marsh Posté le 20-12-2004 à 16:56:29    

Taz a écrit :

ben ouala, c'est tout con.


 
Ben ça me paraît logique  :??:  Je crois que j'ai loupé un épisode  :cry:

Reply

Marsh Posté le 20-12-2004 à 16:58:23    

theShOcKwAvE a écrit :

et c'est apparu recemment ?


 
depuis toujours

Reply

Marsh Posté le 20-12-2004 à 17:00:46    

Taz a écrit :

depuis toujours


 
 
 :??: comment ai-je fait pour eviter de tomber la dessus jusqu'a maintenant ?
 
desole pour mes affirmations douteuses, en tout cas  :jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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