Héritage et variables protected [C++][Débutant] - C++ - Programmation
Marsh Posté le 20-12-2004 à 13:37:39
Oui c'est normal, regarde cette ligne :
Code :
|
Tu fais référence à nbLignes et nbColonnes de l'objet m, et non pas à nbLignes et nbColonnes de la class mère...
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....
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.
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
Marsh Posté le 20-12-2004 à 14:23:47
g++ (GCC) 3.3.4 20040623
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 :
|
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 :
|
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
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
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 ...
Marsh Posté le 20-12-2004 à 16:31:00
Ben ça dépend de l'implémentation des langages, alors, non ?
Marsh Posté le 20-12-2004 à 16:33:49
non
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
public, prive et protected te permettent de definir la visibilite des methodes et attributs aux autres classes.
Marsh Posté le 20-12-2004 à 16:35:49
bon et qui est capable d'expliquer pourquoi cette restriction précises sur protected existe ?
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 ... |
rien à voir. Et c'est d'ailleurs faux.
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...
Marsh Posté le 20-12-2004 à 16:40:41
ReplyMarsh 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
je suis sur que tu peux trouver un exemple
Marsh Posté le 20-12-2004 à 16:42:10
theShOcKwAvE a écrit : explique, alors ... |
bah je vais pas cracher le morceau direct après un déballage de tant de certitudes. Faut le mériter
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 ?
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.
Marsh Posté le 20-12-2004 à 16:56:29
ReplyMarsh Posté le 20-12-2004 à 16:58:23
ReplyMarsh 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
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
SquareMatrix.h
SquareMatrix.cpp
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
---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.