Esta macro se puede definir en algún encabezado global, o mejor, como un parámetro de línea de comando del compilador:
#define me (*this)
Y algún ejemplo de uso:
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;
};
Entonces, en un método de clase cuando accedo a un miembro de la clase, siempre estoy usando me
, y cuando accedo a un identificador global que siempre uso ::
. Esto le da al lector que no está familiarizado con el código (probablemente yo mismo después de unos meses) información localizada de lo que se accede sin la necesidad de buscar en otro lado. Quiero definirlo me
porque encuentro que usarlo en this->
todas partes es demasiado ruidoso y feo. ¿Pero puede #define me (*this)
considerarse una buena práctica de C ++? ¿Hay algunos puntos problemáticos prácticos con la me
macro? Y si usted como programador de C ++ será el lector de algún código utilizando la me
macro, ¿le gustaría o no?
Editar: Debido a que muchas personas argumentan no específicamente contra el uso me
, pero generalmente contra explícito esto. Creo que puede no estar claro cuáles son los beneficios de "explícito esto en todas partes".
¿Cuáles son los beneficios de "explícito esto en todas partes"?
- Como lector del código, tiene la certeza de a qué se accede y puede concentrarse en diferentes cosas que verificar, en algún código distante, que realmente se accede a lo que cree que se accede.
- Puede usar la función de búsqueda más específicamente. La búsqueda "
this->x
" puede proporcionarle más resultados deseados que solo la búsqueda "x
" - Cuando elimina o cambia el nombre de algún miembro, el compilador le notifica de manera confiable en los lugares donde se usa este miembro. (Algunas funciones globales pueden tener el mismo nombre y existe la posibilidad de que pueda introducir un error si no está usando esto explícitamente).
- Cuando refactoriza el código y hace explícita la función no miembro del miembro (para hacer una mejor encapsulación), esto le muestra el lugar que debe editar y puede reemplazarlo fácilmente con el puntero a la instancia de la clase dada como parámetro de función no miembro
- En general, cuando está cambiando el código, hay más posibilidades de errores cuando no está usando esto explícito que cuando está usando esto explícito en todas partes.
- Explícito, esto es menos ruidoso que "m_" explícito cuando está accediendo al miembro desde afuera (
object.member
vsobject.m_member
) (gracias a @Kaz por detectar este punto) - Explícitamente, esto resuelve el problema universalmente para todos los miembros: atributos y métodos, mientras que "m_" u otro prefijo se puede usar prácticamente solo para atributos.
Me gustaría pulir y ampliar esta lista, dígame si conoce otras ventajas y use casos para explícito esto en todas partes .
#define self (*this)
? Incluso puede mezclar ambas macros y tener algunos archivos que imitan VB y otros Python. :)
me_x
.