Klasse: Überall "this->" vorkleben?
-
Danke für den schnellen Input
! Hat mir sehr geholfen.
-
der Compiler bedankt sich für "this->", es hilft ihm beim name lookup, siehe ISO/IEC 14882:2011 3.4 Name lookup S. 45 - 59

-
Eigentlich bin ich weder ein Freund von einem speziellen Member-Präfix (wie "m_") noch finde ich "this->" sonderlich schön. Wenn aber das Projekt eines von beiden Vorgeben würde, wäre meine Wahl eher "this->".
Ich verwende in privaten Projekten this-> nur bei Namenskonflikten zwischen Übergabeparametern und Membervariablen.
-
Ich verwende konsequent
mMemberVariable. Ganz seltenthis->, wenn ich in Templates auf Basisklassenmember zugreifen muss. Meist sind das dann aber Funktionen...this->m_memberVariableist wirklich sinnlos. Etwa gleich wiereturn (expression);oderif (a == true). Es macht Ausdrücke unnötig kompliziert und verwirrt Leute.
-
Wie schreibt ihr nicht:
if ( (a < 5) == true) ;?
SCNR@topic:
Ich verwende auch nie this->. Membervariablen enden bei mir mit einem Unterstrich.
position_, count_, etc.
-
Bei dem _ hatte ich mal den Fehler, dass ich da stehen hatte:
bla = bla;statt
bla_ = bla;Wenn ich wüsste, dass der Parameter gleichnamig ist, hätte ich ohne _ das this genommen.
Natürlich eigene Blödheit, aber ich habe eine halbe Stunde oder so nach dem Fehler gesucht, weil der _ so unauffälig ist.
Seitdem mag ich das nicht mehr. Klassenmember heißen so wie sie heißen. Seit ich das so mache, hatte ich noch nie Konfusion.
-
Eben deshalb verwende ich das ja.
m_variable oder this->variable oder gar this->m_variable stört m.M. nach den Lesefluss.
Da habe ich lieber so ein unauffälliges _.
-
Eisflamme schrieb:
Natürlich eigene Blödheit, aber ich habe eine halbe Stunde oder so nach dem Fehler gesucht
Dein Compiler sollte dich bei soetwas warnen.
-
Nathan schrieb:
Eben deshalb verwende ich das ja.
m_variable oder this->variable oder gar this->m_variable stört m.M. nach den Lesefluss.Darum nehme ich ja
mVariable-- gleiche Konvention wie für alle andere Variablen, nur beginnend mit "m"
Nathan schrieb:
Da habe ich lieber so ein unauffälliges _.
Neben der Übersehbarkeit würde mich hier stören, dass der Unterstrich bei Operatoren schnell untergeht.
-
Ich schreibe weder "this->", noch haben meine Membervariablen irgendeine Kennung wie "", "m", "m" oder was auch immer. Hab auch noch nie den Sinn darin gesehen. Als ein Argument für ein Präfix wird gerne verwendet, dass Intellisense nach dem Tippen des Präfix nur noch Member anzeigt. Toll, bis ich "m_" geschrieben habe, hat ich mit Intellisense schon den korrekten Member ausgewählt, wenn ich kein Präfix benutze. Weiterhin soll ein Prä- oder Suffix angeblich die Übersichtlichkeit erhöhen, welche Variablen lokal sind und welche zur Klasse gehören. Nun, meine Scopes sind außer bei schlampig programmierter Write-Only-Software klein genug, dass ich die Übersicht sowieso nicht verliere. Dann gibt es noch das Argument der gleichnamigen Parameter bei Konstruktoren und Settern. Letztere hab ich eigentlich sowieso nicht. Die Konstruktorargumente brauche ich genau einmal zum Initialisieren der Member. Daher bekommen auch die Konstruktorargumente den abschließenden Unterstrich und nicht die Member.
-
+1 Michael E., bis auf eins:
Michael E. schrieb:
Die Konstruktorargumente brauche ich genau einmal zum Initialisieren der Member. Daher bekommen auch die Konstruktorargumente den abschließenden Unterstrich und nicht die Member.
Weil ich die Member eigentlich ausschliesslich in der Initialisierungsliste initialisiere, kann ich die Parameter auch genau gleich benennen wie sie.
-
Michael E. schrieb:
...
+1

-
Nexus schrieb:
Nathan schrieb:
Eben deshalb verwende ich das ja.
m_variable oder this->variable oder gar this->m_variable stört m.M. nach den Lesefluss.Darum nehme ich ja
mVariable-- gleiche Konvention wie für alle andere Variablen, nur beginnend mit "m"
Ist ja schön und gut.
Ich nutze die Konvention mit_unterstrichen. Da wäre m_ logischerweise notwendig. m_ ist mir jedoch wieder zuviel Tipparbeit. Also nehme ich nur den Unterstrich. Der sollte allerdings wegen Reserviertheit und so ans Ende. Also _.
Und was hast du gegen:position_.x += speed_ * cur_dir_;? Ja, ok, position_-> bzw. position_. sieht seltsam aus.
Allerdings ist das für mich die beste Alternative.
-
Nathan schrieb:
Also nehme ich nur den Unterstrich. Der sollte allerdings wegen Reserviertheit und so ans Ende.

reserved in any scope:
- Bezeichner, die '__' enthalten.
- Bezeichner, die mit '_' beginnen und dann ein Großbuchstabe folgt.
-reserved in global scope:
3) Globale Bezeichner, die mit '_' beginnen.
-
In Sprachen wie Java, Python, JavaScript,... wuerde nie jemand auf die Idee kommen Member speziell zu kennzeichnen.
Lasst die ungarische Notation bitte endlich sterben. Denn das ist nichts anderes als ein ueberbleibsel aus der C Zeit wo wir ungarische Notation als sinnvoll angesehen haben.
-
C++ wurde entworfen, um Datenabstraktion, objektorientiertes Programmieren und generisches Programmieren zusätzlich zu den traditionellen C-Programmiertechniken mit diesen Einschränkungen zu unterstützen. Es war nicht die Absicht, allen Benutzern einen bestimmten Programmierstil aufzuzwingen.
Bjarne Stroustrup
... wenn jemand gern ungarisch schreibt, soll er ungarisch schreiben. und wenn jemand gern spanisch schreibt, soll er spanisch schreiben ...
-
dd++ schrieb:
...
Es gibt einen Unterschied zwischen Programmierstil und Benamsung.
Und mit ungarisch ist nicht Ungarn sondern UN gemeint.Bjarne Stroustrup schrieb:
No I don't recommend "Hungarian". I regard "Hungarian" (embedding an abbreviated version of a type in a variable name) a technique that can be useful in untyped languages, but is completely unsuitable for a language that supports generic programming and object-oriented programming—both of which emphasize selection of operations based on the type an arguments (known to the language or to the run-time support). In this case, "building the type of an object into names" simply complicates and minimizes abstraction.
-
Live and Let Die
-
Michael E. schrieb:
Nun, meine Scopes sind außer bei schlampig programmierter Write-Only-Software klein genug, dass ich die Übersicht sowieso nicht verliere. Dann gibt es noch das Argument der gleichnamigen Parameter bei Konstruktoren und Settern. Letztere hab ich eigentlich sowieso nicht.
Ist ja schön, dass du alles im Blick hast. Aber scheint auch ein wenig idealistisch; wie weit man ohne Setter kommt, haben wir auch erst kürzlich besprochen. Im Grossen und Ganzen klingt die Argumentation wie "ich brauche kein const, da ich im Blick habe, welche Variablen ich verändern darf".
Aber statt das Offensichtliche zu sagen, nämlich dass es auch ohne m-Präfixe geht, wären Gegenargumente hilfreich. Mir persönlich half m nämlich, Code übersichtlicher zu machen -- ich behaupte nicht, das träfe auf alle Leute zu, aber versuche meine Ansicht nachvollziehbar zu machen. Jedoch gehöre ich auch nicht zu den Leuten, die kategorisch keine Funktionen mit mehr als 3 Parametern oder 15 Zeilen schreiben.
Shade Of Mine schrieb:
In Sprachen wie Java, Python, JavaScript,... wuerde nie jemand auf die Idee kommen Member speziell zu kennzeichnen.
Es liegt in der Natur von Java, auf weniger Ideen zu kommen. Im Gegensatz zu C++ existiert ein etablierter Codestil, was Bezeichner angeht -- natürlich wird dann weniger herumexperimentiert.
Shade Of Mine schrieb:
Lasst die ungarische Notation bitte endlich sterben. Denn das ist nichts anderes als ein ueberbleibsel aus der C Zeit wo wir ungarische Notation als sinnvoll angesehen haben.
Schade, dass ihr wieder mal alles in einen Topf werft. Bei UN ging es darum, Typen kennzuzeichnen. Hier ist aber die Rede von Zugehörigkeit zum Objektzustand. Entsprechend treffen die Nachteile der UN, die ich übrigens schon mehrfach in aller Ausführlichkeit aufgezählt habe, nicht auf das m-Präfix zu.
Bitte die Dinge etwas differenzierter sehen.
-
Nexus schrieb:
Shade Of Mine schrieb:
In Sprachen wie Java, Python, JavaScript,... wuerde nie jemand auf die Idee kommen Member speziell zu kennzeichnen.
Es liegt in der Natur von Java, auf weniger Ideen zu kommen. Im Gegensatz zu C++ existiert ein etablierter Codestil, was Bezeichner angeht -- natürlich wird dann weniger herumexperimentiert.
Es existiert mehr Code in nicht-C++ als in C++.
Es wird mehr in nicht-C++ herumexperimentiert als in C++.Ich rede von jeder modernen Sprache. Egal welche. Ruby? PHP? Python? C#? Go? ... Die Liste ist unendlich lang.
Memberqualifizierung ist ein altes Relikt. In C++ hält man daran fest, wie man vielem alten festhält. Denk einfach darüber nach warum keine einzige moderne Sprache memberqualifzierungen verwendet. Keine einzige.
Es funktioniert nämlich nicht. Du hast soviele Scopes und du suchst dir jetzt einen dieser Scopes (Klasse) aus um die Variablen diesen Scopes zu Kennzeichnen.
Dabei hast du:
Globale Variablen
statische Klassen Variablen
Instanz Variablen
und N Stufen Funktionslokale Variablen (denke an Closures).Wenn wir jetzt lokale Klassen dazu nehmen würden, wird das ganze noch komplexer.
Aber du hast auch ohne dem allen eine inkonsistenz: Template Parameter. Kennzeichnest du diese auch? Sie sind ja Member der Klasse. Und die gibt es auch schon wieder auf Klassen Ebene und N Funktionsebenen.
Du hast jetzt zufällig einen Scope ausgewählt und sagst: das Kennzeichnen der Variablen in diesem Scope ist sinnvoll.
Warum dann nicht in allen Scopes? Warum nur der eine?