Essa macro pode ser definida em algum cabeçalho global, ou melhor, como um parâmetro da linha de comando do compilador:
#define me (*this)
E algum exemplo 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;
};
Portanto, em um método de classe, quando acesso um membro da classe, estou sempre usando mee, ao acessar um identificador global, sempre uso ::. Isso fornece ao leitor que não está familiarizado com o código (provavelmente eu mesmo depois de alguns meses) informações localizadas sobre o que é acessado sem a necessidade de procurar em outro lugar. Eu quero definir meporque acho que o uso em this->todos os lugares é muito barulhento e feio. Mas pode #define me (*this)ser considerada uma boa prática de C ++? Existem alguns pontos problemáticos práticos com a memacro? E se você, como programador de C ++, será o leitor de algum código usando a memacro, gostaria ou não?
Edit: Porque muitas pessoas argumentam não especificamente contra o uso me, mas geralmente contra isso explícito. Eu acho que pode não estar claro quais são os benefícios de "isso explícito em todos os lugares".
Quais são os benefícios de "explícito isso em todos os lugares"?
- Como leitor do código, você tem certeza do que é acessado e pode se concentrar em coisas diferentes do que verificar - em algum código distante - que realmente é acessado o que você acha que é acessado.
- Você pode usar a função de pesquisa mais especificamente. A pesquisa "
this->x" pode fornecer mais resultados desejados do que apenas a pesquisa "x" - Quando você está excluindo ou renomeando algum membro, o compilador o notifica de maneira confiável nos locais onde esse membro é usado. (Algumas funções globais podem ter o mesmo nome e existir a chance de introduzir erros se você não estiver usando isso explicitamente).
- Quando você está refatorando o código e tornando a função não membro do membro (para tornar o encapsulamento melhor) explícito, isso mostra o local que você deve editar e pode facilmente substituí-lo pelo ponteiro para a instância da classe fornecida como parâmetro da função não membro
- Geralmente, quando você está alterando o código, há mais possibilidades de erros quando você não está usando isso explícito do que quando você está usando isso explícito em qualquer lugar.
- Explícito, isso é menos barulhento que o explícito "m_" quando você acessa um membro de fora (
object.membervsobject.m_member) (graças a @Kaz para identificar este ponto) - Explícito, isso resolve o problema universalmente para todos os membros - atributos e métodos, enquanto „m_“ ou outro prefixo é praticamente utilizável apenas para atributos.
Gostaria de polir e estender esta lista, me diga se você conhece outras vantagens e casos de uso para explicitar isso em todos os lugares .
#define self (*this)? Você pode até misturar as duas macros e ter alguns arquivos que imitam o VB e outros Python. :)
me_x.