Questa macro può essere definita in alcune intestazioni globali, o meglio, come parametro della riga di comando del compilatore:
#define me (*this)
E qualche esempio di utilizzo:
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;
};
Quindi, in un metodo di classe quando accedo a un membro della classe, lo uso sempre me
e quando accedo a un identificatore globale lo uso sempre ::
. Ciò fornisce al lettore che non ha familiarità con il codice (probabilmente io stesso dopo alcuni mesi) informazioni localizzate di ciò a cui si accede senza la necessità di cercare altrove. Voglio definirlo me
perché trovo che usare this->
ovunque sia troppo rumoroso e brutto. Ma può #define me (*this)
essere considerata una buona pratica C ++? Ci sono alcuni punti pratici problematici con la me
macro? E se tu come programmatore C ++ sarai il lettore di un codice usando la me
macro, ti piacerebbe o no?
Modifica: Perché molte persone non sostengono specificatamente il contrario me
, ma generalmente lo spiegano. Penso che potrebbe non essere chiaro quali siano i vantaggi di "esplicito questo ovunque".
Quali sono i vantaggi di "esplicito questo ovunque"?
- Come lettore del codice hai la certezza di ciò a cui accedi e puoi concentrarti su cose diverse rispetto a verificare - in un codice distante - a cui si accede realmente a ciò che pensi sia accessibile.
- È possibile utilizzare la funzione di ricerca in modo più specifico. La ricerca "
this->x
" può darti più risultati desiderati della sola ricerca "x
" - Quando si elimina o rinomina un membro, il compilatore ti avvisa in modo affidabile nei luoghi in cui viene utilizzato questo membro. (Alcune funzioni globali possono avere lo stesso nome ed esiste la possibilità che tu possa introdurre un errore se non lo usi esplicitamente).
- Quando si esegue il refactoring del codice e si rende esplicita la funzione non membro dal membro (per rendere migliore l'incapsulamento), questo mostra il posto che è necessario modificare e si può facilmente sostituirlo con il puntatore all'istanza della classe fornita come parametro della funzione non membro
- Generalmente quando si modifica il codice, ci sono più possibilità di errori quando non si utilizza esplicitamente questo rispetto a quando si utilizza esplicitamente questo ovunque.
- Esplicito, questo è meno rumoroso di esplicito "m_" quando si accede a un membro esterno (
object.member
vsobject.m_member
) (grazie a @Kaz per individuare questo punto) - Esplicito questo risolve il problema dell'universalità per tutti i membri - attributi e metodi, mentre "m_" o altri prefissi sono praticamente utilizzabili solo per gli attributi.
Vorrei lucidare ed estendere questo elenco, dimmi se sei a conoscenza di altri vantaggi e utilizzare casi per esplicitare questo ovunque .
#define self (*this)
? Puoi anche mescolare entrambe le macro e avere alcuni file che imitano VB e altri Python. :)
#include "vb.h"
, #Include pascal.h
, o #include FOTRAN.h
e hanno la persona accanto a toccare il codice sottopone al TDWTF .
me_x
.