Dieses Makro kann in einem globalen Header oder besser als Compiler-Befehlszeilenparameter definiert werden:
#define me (*this)
Und ein Anwendungsbeispiel:
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;
};
In einer Klassenmethode verwende ich beim Zugriff auf ein Klassenmitglied immer me
und beim Zugriff auf einen globalen Bezeichner immer ::
. Dies gibt dem Leser, der mit dem Code nicht vertraut ist (wahrscheinlich ich selbst nach ein paar Monaten), lokalisierte Informationen darüber, worauf zugegriffen wird, ohne dass er irgendwo anders suchen muss. Ich möchte definieren, me
weil ich die Verwendung this->
überall zu laut und hässlich finde . Aber kann #define me (*this)
eine gute C ++ - Praxis betrachtet werden? Gibt es einige praktische Probleme mit dem me
Makro? Und wenn Sie als C ++ - Programmierer der Leser von Code sein werden, der das me
Makro verwendet, würden Sie es mögen oder nicht?
Edit: Weil viele Leute nicht spezifisch dagegen argumentieren me
, sondern generell dagegen explizit. Ich denke, es ist möglicherweise nicht klar, welche Vorteile es hat, "dies überall zu verdeutlichen".
Was sind die Vorteile von "explizit dies überall"?
- Als Leser des Codes haben Sie die Gewissheit, auf was zugegriffen wird, und können sich auf andere Dinge konzentrieren, als zu überprüfen, ob in einem entfernten Code wirklich auf das zugegriffen wird, worauf Ihrer Meinung nach zugegriffen wird.
- Sie können die Suchfunktion genauer verwenden. Suche "
this->x
" kann mehr gewünschte Ergebnisse liefern als nur Suche "x
" - Wenn Sie ein Mitglied löschen oder umbenennen, benachrichtigt Sie der Compiler zuverlässig an den Stellen, an denen dieses Mitglied verwendet wird. (Einige globale Funktionen können denselben Namen haben und es besteht die Möglichkeit, dass Sie einen Fehler einführen, wenn Sie dies nicht explizit verwenden.)
- Wenn Sie Code umgestalten und die Nicht-Member-Funktion von Member explizit machen (um eine bessere Kapselung zu erreichen), wird angezeigt, welche Stelle Sie bearbeiten müssen, und Sie können dies einfach durch einen Zeiger auf eine Instanz der Klasse ersetzen, die als Nicht-Member-Funktionsparameter angegeben ist
- Im Allgemeinen gibt es beim Ändern von Code mehr Möglichkeiten für Fehler, wenn Sie dies nicht explizit verwenden, als wenn Sie dies überall explizit verwenden.
- Explizit ist dies weniger laut als explizit „m_“, wenn Sie ein Mitglied von außerhalb (
object.member
vsobject.m_member
) ansprechen (danke an @Kaz, um diesen Punkt zu erkennen) - Explizit löst dies das Problem universell für alle Mitglieder - Attribute und Methoden, wohingegen „m_“ oder ein anderes Präfix praktisch nur für Attribute verwendbar ist.
Ich würde diese Liste gerne polieren und erweitern, sagen Sie mir, ob Sie über andere Vorteile Bescheid wissen, und verwenden Sie Anwendungsfälle, um dies überall explizit zu verdeutlichen .
#define self (*this)
? Sie können sogar beide Makros mischen und einige Dateien VB und andere Python imitieren lassen. :)
me_x
.