Wenn ich die Daten einer Klasse Kapsle (kein zugriff von außen) muss ich der Klasse Methoden mitgeben (set-Methode), um indirekten zugriff auf private Member zu ermöglichen. So kann dann ein non-friend Gloabl Operator auf die "innerein" einer Klasse zugreifen und ändern (ebenfall der ganze Rest, hat mit den setMethoden zugriff). Oder ich mache den Globalen Operator friend dann kann er ebenfalls auf alle "innerein" der Klasse zugreifen.
Ich bitte im Kopf zu behalten meine Frage die Voraus gegangen ist!
Oder ich könnte einen Operator gleich mit der Klasse anbieten, muss keine setMethoden schreiben die ich gar nicht haben will und brauch auch keinen Globalen friend Operator.
Letzteres ist für mich persönlich die sauberste Lösung was
Datenkapselung angeht.
witziger weise wenn man sich mal die Klassen anschaut z.B. die
VideoMode Klasseder SFML sind alle Member public.
Im Idealfall sind aber nicht alle Attribute einer Klasse einfach
private und durch Getter/Setter erreichbar, sondern durch die öffentlichen Methoden der Klasse abstrahiert. Die tatsächliche Repräsentation der Instanz („Haben die Bits gleiche Werte?“) interessiert dich dann nicht, sondern eher so etwas wie „Hören sie auf den gleichen Namen?“. Würdest du unter diesen Umständen direkt auf die Attribute zugreifen, und etwas an der Klasse ändern, müsstest du den Operator danach ebenfalls überarbeiten. So lange er keinen Zugriff auf die Interna hat (non-member), kannst du die Implementierung der Klasse aber beliebig umgestalten ohne den Operator kaputtzumachen.
Wenn dich nur die reinen Daten interessieren, die dort gespeichert sind, dann benutz besser eine Datenstruktur statt einer Klasse. Erst alles
private machen, und es dann wieder aushebeln indem man alles zum
friend macht und allen Attributen Getter und Setter verpasst, ist tatsächlich Nonsens der nur nutzlosen Quelltext und überflüssige Abhängigkeiten verursacht. Wenn du den Operator als Methode in die Klasse einfügst, hast du weniger Quelltext, aber immernoch genau so viele Abhängigkeiten (denn der Quelltext des Operators benutzt immernoch direkt die Daten). Die wenigsten Abhängigkeiten hast du, wenn du über einen freien, nicht befreundeten Operator auf den Instanzen agierst, falls du das kannst.
Und sf::VideoMode sieht mir tatsächlich mehr nach einer Datenstruktur denn nach einer Klasse aus; es soll augenscheinlich einfach drei Zahlen speichern. Dann sollte man es auch so halten. Datenstrukturen haben aber üblicherweise keine Methoden, sondern werden von Funktionen verwendet.
Jetzt fängt er wieder an zu philosophieren und sich an Wörtern aufzuhängen. Manchmal frage ich mich, Krishty, was genau der Sinn der Diskussionen von dot und Dir sind.
Frag dich nochmal nachdem du zu Seite 1 zurückgegangen bist und verstanden hast, was dort steht :-)