Cette macro peut être définie dans un en-tête global, ou mieux, en tant que paramètre de ligne de commande du compilateur:
#define me (*this)
Et un exemple d'utilisation:
some_header.h:
inline void Update()
{
/* ... */
}
main.cpp:
#include "some_header.h"
class A {
public:
void SetX(int x)
{
me.x = x;
me.Update();
}
void SomeOtherFunction()
{
::Update();
}
/*
100 or more lines
...
*/
void Update()
{
// ...
}
int x;
};
Ainsi, dans une méthode de classe lorsque j'accède à un membre de la classe, j'utilise toujours me
et lorsque j'accède à un identifiant global, j'utilise toujours ::
. Cela donne au lecteur qui n'est pas familier avec le code (probablement moi-même après quelques mois) des informations localisées de ce qui est accessible sans avoir besoin de chercher ailleurs. Je veux définir me
car je trouve l'utilisation this->
partout trop bruyante et laide. Mais peut- #define me (*this)
on considérer comme une bonne pratique C ++? Y a-t-il des points pratiques problématiques avec la me
macro? Et si vous, en tant que programmeur C ++, serez le lecteur de code à l'aide de la me
macro, cela vous plaira ou non?
Edit: Parce que beaucoup de gens ne soutiennent pas spécifiquement contre l'utilisation me
, mais contre expliquent généralement cela. Je pense qu'il n'est peut-être pas clair quels sont les avantages de «l'expliciter partout».
Quels sont les avantages de "l'expliciter partout"?
- En tant que lecteur du code, vous avez la certitude de ce qui est accédé et vous pouvez vous concentrer sur des choses différentes que de vérifier - dans un code distant - que vous avez réellement accès à ce que vous pensez être accédé.
- Vous pouvez utiliser la fonction de recherche plus spécifiquement. La recherche "
this->x
" peut vous donner plus de résultats que la recherche "x
" - Lorsque vous supprimez ou renommez un membre, le compilateur vous avertit de manière fiable aux endroits où ce membre est utilisé. (Certaines fonctions globales peuvent avoir le même nom et exister, vous pouvez introduire une erreur si vous n'utilisez pas cela explicitement).
- Lorsque vous refactorisez du code et rendez explicite la fonction non membre à partir d'un membre (pour une meilleure encapsulation), cela vous montre où vous devez modifier et vous pouvez facilement le remplacer par un pointeur sur l'instance de classe donnée comme paramètre de fonction non membre
- Généralement, lorsque vous modifiez du code, il y a plus de possibilités d'erreurs lorsque vous n'utilisez pas cela explicitement que lorsque vous utilisez cela explicitement partout.
- Explicite, c'est moins bruyant que «m_» explicite lorsque vous accédez à un membre de l'extérieur (
object.member
vsobject.m_member
) (merci à @Kaz de repérer ce point) - Explicitement, cela résout le problème universellement pour tous les membres - attributs et méthodes, alors que «m_» ou un autre préfixe n'est pratiquement utilisable que pour les attributs.
Je voudrais peaufiner et étendre cette liste, dites-moi si vous connaissez d'autres avantages et utilisez des cas pour l'expliquer partout .
#define self (*this)
? Vous pouvez même mélanger les deux macros et avoir certains fichiers imitant VB et d'autres Python. :)
me_x
.