Bonjour,
J'ai l'habitude de ne pas utiliser le pointeur this pour accéder aux membres de ma classe. Je suis simplement une convention de nomage qui dit que tout nom d'un membre non public doit commencer par un "_".
Ainsi, il ne peut y avoir de confusion entre membre et variable locale comme illustré ci-dessous :
N.B : Je sépare bien sûr déclaration/définition dans leur fichier respectif, j'ai tout mit ensemble afin de simplifier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class MaClasse { public: ... setAttribut(int attribut) { _attribut = attribut; } protected: int _attribut; };
Accès aux membres hérités depuis une classe dérivée :
Cela fonctionne également lorsque il s'agit d'accéder aux membres protégés d'une classe dérivée qui ont été hérités d'une classe de base :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class Base { protected: int _attribut; };Avec les classes génériques...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class Derivee : public Base { public: Derivee(int attribut) { _attribut = attribut; } };
Mais en voulant m'exercer avec les classes génériques (utilisation de templates), je me suis confronté à un problème.
Lorsque une classe générique hérite d'une autre classe générique, l'accès aux membres protégés de la classe de base depuis la classe héritée sans l'utilisation du pointeur this ne fonctionne pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 template<typename T> class BaseGenerique { protected: T _attribut; };Vous allez me dire "Mais pourquoi n'utilise-tu pas le pointeur this dans tous les cas ?". C'est vrai, mais je voulais simplement savoir d'où cette différence pouvais bien venir.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 template<typename T> class DeriveeGenerique : BaseGenerique<T> { public: DeriveeGenerique(T attribut) { _attribut = attribut; // erreur : '_attribut' was not declared in this scope this->_attribut = attribut; // fonctionne } };
Merci.
EDIT : Je suis sous Mac OS X 10.6.4, j'utilise Xcode et GCC 4.2 pour la compilation.
Partager