Klassen -> Private
-
ich denke du meinst so etwas wie:
class A { private: int x; public: A(); void setx(int sx); int getx(); };
jetzt kann man die methoden zb so implementieren:
void A::setx(int sx) {x = sx;} int A::getx() {return x;}
dann sehe ich auch keinen Sinn darin diese Variable private zu halten. Aber wenn du zum Beispiel nur die methode getx implementierst und damit kein schreiben erlaubst, dann macht es Sinn. Man kann die Methoden auch benutzen um den Zugriff auf x zu synchronisieren.
Gruß Mirauder Mo
-
Meinst du sowas?
class foo { private: int x; public: void set_x(int x_) { x = _x; }; int get_x() { return x; }; }
Wenn du sowas meinst: Das soll man auch nicht machen! Das mindeste, was da noch
reingehört, wäre z.B. eine Gültigkeitsprüfung für x_ in set_x(). Und selbst das
ist nicht schön. Solche Konstruktionen deuten (meistens) darauf hin, dass mit
dem Klassendesign irgendwas nicht stimmt.
-
Man muss in den wenigsten Fällen (direkt oder indirekt) Elemente der Klasse selber ändern.
Viel besser ist sowas (geklauter GTA Quellcode
):
Vehicle::repair() { farbe = randomColor() repairAlleReifen(); damage = 0; }
Alternativ könntest du jetzt natürlich setter für die farbe, für den damage anbieten und repairAlleReifen() public machen. Wie du aber selber schon erkannt hast, ist genauso schlecht, wie wenn du gleich alles public machst.
-
ja.. genau so wie Mirauder_Mo
class A { private: int x; public: A(); void setx(int sx); int getx(); };
nachdenk
Aber wenn du zum Beispiel nur die methode getx implementierst und damit kein schreiben erlaubst, dann macht es Sinn.
du meinst so dass ich den Wert nicht ändern darf -> ihn aber trotzdem Ausgebe?
> dann könnte ich genauso gut int x als Konstane definieren (in public) und hätte das selbe erreicht
Man kann die Methoden auch benutzen um den Zugriff auf x zu synchronisieren
könntest du das etwas genauer erlären.. weiß jetzt nicht was du damit meinst?
.. ist's vielleicht dafür da Programmfehler zu vermeiden z.B. wenn ich mal ungewollt einen Wert verändere der in public steht..
damit das seltener passiert benutze ich einfach eine Methode die auf private zugreifen darf?@ Taurin
Wenn du sowas meinst: Das soll man auch nicht machen!
wann soll ich es den Anwenden?
insane
-
Das, was man durch Klassen ja in erster Linie erreichen will, ist Kapselung.
D.h. bei set und get ist es jetzt wahrscheinlich so logisch, aber ansonsten soll der Benutzer der Klasse nicht sehen, wie die Klasse arbeitet.
Oder anders:
Wäre x public und man würde sich aus irgendeinem Grund entscheiden die get-Funktion anders zu formulieren, so hätte man ein Problem.
Man könnte im Nachhinein die Herausgabe der Variable nicht mehr ändenr...Ach egal, vergesst, was ich sagen wollte...
-
Also durch privat vermeide ich Programmfehler.. das hab ich verstanden!
Mis2com
D.h. bei set und get ist es jetzt wahrscheinlich so logisch, aber ansonsten soll der Benutzer der Klasse nicht sehen, wie die Klasse arbeitet.
Shade Of Mine
du machst sie nicht für dich private, sondern für den Benutzer der Klasse.
das was Mis2com und Shade Of Mine schreiben verstehe ich nicht ganz ...
wer ist der Benutzer? Sorry, auch wenns für euch grad dumm klingt ... bin dabei C++ zu lernen.
-
insane_desire schrieb:
dann könnte ich genauso gut int x als Konstane definieren (in public) und hätte das selbe erreicht
Nein, die variable könnte immer noch in den methoden der Klasse geändert werden. Es ist zb vorstellbar das du eine Verketteliste implementiert in der du eine Variable hast die die Anzahl der Elemente wiedergibt. von der wolltest du vieleicht das man sie von ausen lesen kann, aber verändert werden dürfte sie nur durch die eigenen methoden wie insert(Element e) oder remove(Element e).
insane_desire schrieb:
könntest du das etwas genauer erlären.. weiß jetzt nicht was du damit meinst?
Du hast 2 Threads die beide einen Zeiger auf die Klasse besitzen. Jetzt wollen beide etwas in x rein schreiben. der erste fängt an zu schreiben, hat die hälfte geschrieben, dann kommt ein Threadwechsel und der zweite ist dran, der schreibt sein x komplet in die variable, dann kommt wieder ein wechsel und der erste schreibt den rest von seinem x in die variable. Dann hat man in x die hälfte von dem einen und die andere hälfte von dem anderen drin. das läst sich mich sachen wie mutex oder semaphor verhindern.
Bei einem integer ist das recht unwahrscheinlich, aber es gibt ja noch ander Typen.
Gruß Mirauder Mo
-
@ Mirauder_Mo
um ehrlich zu sein hab ich grad Null verstanden
das liegt aber an mir .. denk das ich einfach mehr Hintergrundwissen brauche um den Sinn zu begreifenauf jeden Fall vielen dank für die schnelle Hilfe an alle
MFG Insane
-
Vielleicht versuchen wir es mal mit einem einfacheren Beispiel:
class X { public: int i; }
Der gesamt Code kann jetzt direkt auf i zugreifen. Irgendwann stellst Du fest, daß i niemals kleiner als 5 werden darf, sollte es doch jemand kleiner machen, dann soll es auf 5 gesetzt werden. Jetzt mußt Du Deinen gesamten Code durchsuchen und jede Stelle, die dort zugreift so modifizieren, daß sie das neue Verhalten hat. (kurze Zeit später ändert sich der Mindestwert natürlich auf 7 ;))
Mit set/get:
class X { int i; public: void set(int neu) { i = neu; } int get() { return i }; }
so, jetzt kommt die obige Änderung. Was wir tun ist folgendes:
class X { int i; public: void set(int neu) { if(neu>=5) i = neu; else i=5; } int get() { return i }; }
Und die Sache ist erledigt. Was praktischer und einfacher ist dürfte klar sein. Und eines kann ich Dich ganz sicher versprechen: Solche Änderungen kommen.
MfG Jester
-
boah
... perfekt habs geschnallt
also, wenn man's genau nimmt der bequemlichkeit halber
um Fehler zu vermeiden
und sicherzustellen (wie in diesem Fall) das i nicht größer als 5 ist << Sicherheit << der Wert kann nur über diese Methode gändert werdenthx Jester
Gruß Insane