Kennzeichnung von privaten Attributen
-
Hallo,
kurze Frage die mir jetzt schon seit ner Weile auf der Seele brennt.
Ich fang ja erst an und hatte mir ja auch versucht so ein bischen eine einheitliche schreibweise anzugewöhnen.Also dachte ich mir private attribute einer klasse mit einem _ davor zu kennzeichnen. Der grund ?
Ganz einfach, hier ein Bsp aus dem buch hier, macht sich ganz gut dafür.class CBecher { private: // ich weiß, braucht man nicht extra hinschreiben string _inhalt; int _fuellhoehe; float _fuellmenge; public: CBecher(string Inhalt, int fuellmenge, float fuellhoehe) : _inhalt(Inhalt), _fuellmenge(fuellmenge), _fuellhoehe(fuellhoehe) {}; };So, soll mal als Bsp. dienen.
Wenn ich jetzt einen Becher erstelle, dann kommt intellisense und macht doch so ein kleines gelbes fenster beim schreiben wo drin steht was man beim erstellen eines Bechers alles angeben muss. Ist ja kein Standart konstruktor verfügbar.
Ihr wisst hoffentlich was ich meine ?Becher erzeugen:
CBecher b = new CBecher(Inhalt, fuellmenge, fuellhoehe);Sobald man die Klammer hinter CBecher aufmacht kommt das Fensterchen.
Ok, und genau dort steht dann nicht z.B. CBecher(i, fm, fh) oder so was in der art.
Wie macht ihr das also das ihr da nicht durcheinander kommt ?
Matthias
-
STF-DIR schrieb:
...
Also dachte ich mir private attribute einer klasse mit einem _ davor zu kennzeichnen. ...Hi,
ich glaube, in dem Buch geht es nicht so sehr um die "Privatheit" der Attribute, als vielmehr darum, dass es eben Attribute der Klasse sind ... und ich persönlich halte da gar nichts von.

Einerseits ist es gefährlich, weil es Compiler gibt, die selbst eine Menge "Interna" einführe, die sie damit kennzeichnen, dass ihre Namen mit '_' anfangen ... plötzlich läuft Dein Code nicht oder macht seltsame Kapriolen, weil Du zufällig einen Namen erwischt hast, mit der Compiler (vielleicht erst in dieser Version) damit etwas ganz anderes verbindet.Andererseits verbringt man viel Zeit damit, diese Namen zu pflegen ... irgendwann stellst Du fest, dass Du statt eines Attributs lieber eine Funktion desselben Namens verwenden möchtest ... dann musst Du den gesamten Code durchfräsen und den underscore wegmachen ... und überhaupt: Wieso sollten Memberfunktionen keinen '_' haben ?
Und schließlich sehe ich da keinen Vorteil drin.
Pro: 0 Contra: 2
STF-DIR schrieb:
...
Ok, und genau dort steht dann nicht z.B. CBecher(i, fm, fh) oder so was in der art....Sondern ? Steht da nichts drin oder was Anderes ?
Ich vermute mal, Du nutzt eine Microsoft-IDE, oder ?
Meine VC6.0 kommt damit auch recht häufig durcheinander und ich habe noch nicht rausbekommen, warum bzw. was ich dagegen tue. Da ich inzwischen auf eclipse&gcc umgestiegen bin (und der diese Probleme nicht und dafür einige Vorteile hat), habe ich da auch keine Lösung für. Ich glaube allerdings nicht unbedingt, dass das an den '_' liegt...Gruß
Simon2.
-
Eine einheitliche Schreibweise für Member gibt es nicht, nur verschiedene persönliche Meinungen (von 'm_Name' bis hin zu 'Name_' - die Schreibweise '_Name' könnte Probleme geben, weil solche Namen für den Compiler freigegeben sind).
Anmerkung: Was Intellisense dir da entgegenspuckt, sind die Parameternamen, die du bei der Konstruktor-Deklaration angegeben hast - wenn du die Chance hast, sollten die schon vernünftig gewählt werden. Aber du bist natürlich nicht verpflichtet, gleichnamige Variablen für den Aufruf anzulegen -
CBecher* b = new CBecher("Kamillentee",1,0.3);geht genauso durch den Compiler
-
Hallo,
dank für die Antwort !
Also Methoden oder funktionen sollten gleube ich keinen _ am Anfang haben weil es da eben auch funktionen gibt die mit _ anfangen.
Das kann dann genauso zu einem durcheinander führen oder ?Ja ich benutze die IDE von MS, steht in meiner Signatur

Ich hab mal ein Bild gemacht was ich meine :
http://www.starflight-virtual.de/image318.jpg
da sieht man das kleine Fenster was ich meine.
der Konstruktor dazu sieht jetzt so aus :
CBecher(System::String^ inhalt, System::UInt32 fassungsvermoegen, System::Single fuellhoehe);Wenn der so ausshen würde :
CBecher(System::String^ i, System::UInt32 fv, System::Single fh);dann würde Intellisense ja auch was anderes vorschlagen in dem gelben fensterchen, und zwar würde dann auch nur i, fv und fh drin stehen und das ist ja nicht wirklich aussagekräftig was das genau sein soll oder ?
Also wie macht ihr das ?
Man hat ja im grunde genommen einen Wert für das private Attribut, dann vielleicht noch eine Property, die anders heißen muss und einen Konstruktor ja auch noch dem da andere Veriablennamen übergeben werden müssen.
Das wären ja jetzt schon 3 verschieden namen für einen Wert oder ?Hmm, könnte das nicht zu einem Variablennamen Wirrwar führen ?
Matthias
-
Wie gesagt, das Intellisense gibt immer die Deklaration der entsprechenden Funktion wieder - wie die privaten Member heißen, sollte für den Anwender auch egal sein. Deshalb verwende ich normalerweise für die CTor-Parameter besonders klangvolle Namen (die sieht man in Dokumentationen oder eben beim Intellisense) und für die tatsächlichen Membervariablen idR 'm_Name'.
Properties gibt es in reinem C++ nicht, höchstens Getter und Setter (die dann entsprechend als getName() bzw. setName() bezeichnet werden) - und selbst wenn, besteht da afaik kein Namenskonflikt zwischen dem Ctor-Parameter und einer eventuell gleichnamigen Property.Namen, die mit _ beginnen, solltest du besser nicht verwenden, die sind für die interne Verwendung durch den Compiler reserviert (und selbst wenn die aktuelle Version sie nicht nutzt - in der nächsten Version kann das schon wieder anders aussehen).
-
Ok, alles klar,
ich werde die dann sicher auch m_Name nennen damit ich die unterscheiden kann.
Danke Euch !!
MAtthias
-
CStoll schrieb:
Namen, die mit _ beginnen, solltest du besser nicht verwenden, die sind für die interne Verwendung durch den Compiler reserviert (und selbst wenn die aktuelle Version sie nicht nutzt - in der nächsten Version kann das schon wieder anders aussehen).
Das sollte echt mal jemand bei snopes eintragen. (Und nein, die Regeln sind nicht wirklich zu kompliziert.)
-
Hallo,
was ist "snopes" ?? und an wen war das posting jetzt ggerichtet ? Speziell das was Du in Klammern geschrieben hast.
Matthias
-
STF-DIR schrieb:
was ist "snopes" ??
Google: snopes, erster Treffer: www.snopes.com
STF-DIR schrieb:
und an wen war das posting jetzt ggerichtet ? Speziell das was Du in Klammern geschrieben hast.
-
Es gibt uebrigens einen FAQ-Eintrag dazu:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39461.html
-
Blue-Tiger schrieb:
Es gibt uebrigens einen FAQ-Eintrag dazu:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39461.htmlDanke , habs gerade gelesen !
Was hat das alles hier denn mit DIESER seite zu tun ?
Ich mach doch hier keine Faxen oder ähnliches !
Ich versuche hier ernsthaft zu lernen !Für mich ist die Frage jetzt geklärt.
Danke allen
Matthias
-
Hi,
das bezog sich auch nicht auf Dich, sondern auf CStoll ... vermutlich hält finix die Sache mit den underscores für eine "urban legend" (die eben bei snopes gesammelt und untersucht werden).
Gruß,
Simon2.