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. :)#include "vb.h"
,#Include pascal.h
o#include FOTRAN.h
y tienen la siguiente persona que tocar el código de someterlo a TDWTF .me_x
.Respuestas:
No, no es.
Tenga en cuenta al programador que mantendrá su código dentro de varios años, mucho después de que se haya ido a pastos más verdes y siga las convenciones comunes del lenguaje que usa. En C ++, casi nunca tiene que escribir
this
, porque la clase se incluye en el orden de resolución de símbolos y cuando un símbolo se encuentra en el alcance de la clase,this->
está implícito. Así que no lo escribas como todos lo hacen.Si a menudo se confunde qué símbolos provienen del alcance de la clase, el enfoque habitual es usar un patrón de nomenclatura común para los miembros (campos y, a veces, métodos privados; no lo he visto utilizado para métodos públicos). Los comunes incluyen sufijos
_
o prefijos conm_
om
.fuente
this
para dejar explícitamente en claro que la variable no es local para el método. La pregunta aquí es si la macrome
debería existir, no sithis
es algo que debería usarse.me.
lugar dethis->
. Como no hay necesidad dethis->
eso, no hay necesidad deme.
hacerlo y, por lo tanto, no hay necesidad de macro.this->
"es necesario". De hecho, el OP dice que está usandothis->
a pesar de que no es necesario. La pregunta es acerca de sime.
debe usarse en lugar dethis->
, lo que esta respuesta en realidad no responde.this
y, por lo tanto, se requiere una discusión sobre ese punto para lograr una conclusión completamente equilibrada.Entonces, quieres crear un nuevo idioma. Luego hazlo y no paralices C ++.
Hay varias razones para no hacerlo:
this
es, y al agregar dicha macro, en realidad están agregando una nueva palabra clave. ¿Qué pasa si todos presentan algo que les gusta? ¿Cómo se vería el código?(*this).
o no usarlothis->
, excepto en algunos casos especiales (vea esta respuesta y busque "this->")Su código no es diferente del
#define R return
que vi en el código real. ¿Razón? ¡Menos tipeo!Yendo un poco fuera del tema, pero aquí voy a ampliar el punto 3 (no usar
(*this).
othis->
en una clase).En primer lugar,
(*this).
othis->
se utilizan para acceder a las variables miembro o funciones del objeto. Usarlo no tiene sentido y significa escribir más. Además, leer dicho código es más difícil porque hay más texto. Eso significa un mantenimiento más difícil.Entonces, ¿cuáles son los casos en los que tiene que usar
this->
?(a) Selección desafortunada del nombre del argumento.
En este ejemplo,
this->
es obligatorio, ya que el argumento tiene el mismo nombre que la variable miembro:(b) Cuando se trata de plantillas y herencia (ver esto )
Este ejemplo no se compilará, porque el compilador no sabe a qué variable se llama
v
para acceder.fuente
*this.
ythis->
this->
es tan útil comoauto
en pre-c ++ 11. En otras palabras, solo aumenta el ruido del código.Sugiero no hacer esto. Esto le da a un lector que no está familiarizado con su macro un gran " WTF " cada vez que ve esto. El código no se vuelve más legible al inventar "nuevas convenciones" sobre las generalmente aceptadas sin ninguna necesidad real.
Eso puede parecerle así, tal vez porque hizo mucha programación en lenguajes usando la palabra clave
me
(¿Visual Basic, supongo?). Pero, de hecho, es solo una cuestión de acostumbrarse,this->
es bastante corto, y creo que la mayoría de los programadores experimentados de C ++ no estarán de acuerdo con su opinión. Y en el caso anterior, ni el usothis->
ni el uso deme
es apropiado: obtienes la menor cantidad de desorden al dejar esas palabras clave al acceder a los miembros de datos dentro de las funciones de miembro.Si desea que sus variables de miembros privados se distingan de las locales, agregue algo
m_
como un prefijo o un guión bajo como sufijo (pero como puede ver aquí , incluso esta convención es "demasiado ruidosa" para muchas personas).fuente
_
debe ser sufijo ; como prefijo está reservado para símbolos internos de bibliotecas estándar y extensiones de proveedores.__
(dos guiones bajos) o un guión bajo seguido de una letra mayúscula. Un solo guión bajo seguido de una letra minúscula está bien, siempre que no esté en el espacio de nombres global.Por favor no lo hagas! Estoy tratando de hacer frente a una gran base de código donde las macros están por todas partes para guardar la escritura. Lo malo de redefinir esto para mí es que el preprocesador lo reemplazará en todas partes, incluso cuando esto no esté dentro del alcance / no se aplique, por ejemplo, una función independiente, su colega colega podría tener una variable local llamada en otro lugar ... (s) no será feliz depurando ... Terminas teniendo macros que no puedes usar en todos los ámbitos.
fuente
¡NO!
Solo imagine la confusión que ocurrirá si alguien # incluye ese encabezado, sin conocer su truco, y en otra parte de su archivo tienen una variable o función llamada "yo". Estarían terriblemente confundidos por cualquier mensaje de error inescrutable que se imprima.
fuente