To makro można zdefiniować w nagłówku globalnym lub lepiej jako parametr wiersza polecenia kompilatora:
#define me (*this)
I przykład użycia:
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;
};
Tak więc w metodzie klasowej, kiedy uzyskuję dostęp do członka klasy, zawsze używam me, a podczas uzyskiwania dostępu do identyfikatora globalnego zawsze używam ::. To daje czytelnikowi, który nie jest zaznajomiony z kodem (prawdopodobnie po kilku miesiącach) zlokalizowane informacje o tym, do czego można uzyskać dostęp bez konieczności szukania gdzie indziej. Chcę zdefiniować, meponieważ uważam, że używanie this->wszędzie jest zbyt głośne i brzydkie. Ale czy można #define me (*this)to uznać za dobrą praktykę w C ++? Czy są jakieś praktyczne problemy z memakrem? A jeśli jako programista C ++ będziesz czytał jakiś kod za pomocą memakra, chciałbyś go, czy nie?
Edycja: Ponieważ wiele osób twierdzi, że nie przeciwstawia się temu me, ale ogólnie przeciwstawia się temu wyraźnie. Myślę, że może nie być jasne, jakie są korzyści z „wyraźnego wyrażenia tego wszędzie”.
Jakie są korzyści z „wyrażania tego wszędzie”?
- Jako czytelnik kodu masz pewność, co jest dostępne i możesz skoncentrować się na innych rzeczach niż zweryfikować - w jakimś odległym kodzie - czy naprawdę można uzyskać dostęp do tego, co według ciebie jest dostępne.
- Możesz użyć funkcji wyszukiwania bardziej szczegółowo. Wyszukiwanie „
this->x” może dać więcej pożądanych wyników niż tylko wyszukiwanie „x” - Kiedy usuwasz lub zmieniasz nazwę jakiegoś członka, kompilator niezawodnie powiadamia cię w miejscach, w których ten członek jest używany. (Niektóre funkcje globalne mogą mieć tę samą nazwę i istnieć szansa, że możesz wprowadzić błąd, jeśli nie używasz tego jawnie).
- Kiedy refaktoryzujesz kod i czynisz funkcję inną niż element członkowską (aby uzyskać lepszą enkapsulację) jawnie, pokazuje to miejsce, które musisz edytować i możesz łatwo zastąpić to wskaźnikiem do instancji klasy podanej jako parametr funkcji niebędącej członkiem
- Zasadniczo, gdy zmieniasz kod, istnieje więcej możliwości wystąpienia błędów, gdy nie używasz tego jawnie, niż gdy używasz tego jawnie wszędzie.
- Wyraźnie to jest mniej głośne niż wyraźne „m_”, gdy uzyskujesz dostęp do członka z zewnątrz (
object.membervsobject.m_member) (dzięki @Kaz zauważył ten punkt) - Wyjaśnij, że rozwiązuje to problem uniwersalnie dla wszystkich członków - atrybutów i metod, podczas gdy „m_” lub inny prefiks jest praktycznie użyteczny tylko dla atrybutów.
Chciałbym dopracować i rozszerzyć tę listę, powiedzieć mi, czy wiesz o innych zaletach, i użyć przypadków, aby to wszędzie wyrazić .
#define self (*this)? Możesz nawet mieszać oba makra i mieć niektóre pliki imitujące VB i inne Python. :)
me_x.