Kapselung: Zugriff auf "private"-Elemente
-
Hallo!
Ich kämpfe mich - nach langer C/C++-Abstinenz - zur Zeit durch "OOP für Dummies". Eigentlich dachte ich, ich hätte das mit der Kapselung verstanden:
"_Niemand_ darf von außen auf als privat deklarierte Attribute einer Klasse (bzw. einer Instanz derselben) zugreifen."
Aber folgendes wird ja ständig verwendet:
[cpp] class Test { public: Test() : m_Attrib() { } Test(const Test& test) { m_Attrib = test.m_Attrib; } private: std::string m_Attrib; }; [/cpp]Der Copy-Konstruktor von Test greift hier also auf private Elemente der Instanz "test" zu.
Muss es daher heißen:
"_Niemand_ (außer Instanzen derselben Klasse) darf von außen auf als privat deklarierte Attribute einer Klasse (bzw. einer Instanz derselben) zugreifen."?Was hab' ich da nicht verstanden?
Viele Grüße,
Gnirx
-
Hallo
Muss es daher heißen:
"_Niemand_ (außer Instanzen derselben Klasse) darf von außen auf als privat deklarierte Attribute einer Klasse (bzw. einer Instanz derselben) zugreifen."?Korrekt.
bis bald
akari
-
akari schrieb:
Korrekt.
Wunderbar

Vielen Dank und bis zum nächsten Mal,
Gnirx
-
Hi!
Falsch, auch befreundete Klassen dürfen das...
grüße
-
wenn mans genau nehmen will, ist der satz "_niemand_ darf von außen auf private membervariablen zugreifen" völlig korrekt, denn eine instanz der klasse greift nicht von _außen_ auf die variable zu

und das mit den friends ist so eine sache für sich. ich bin eh der meinung, dass die dinger aus dem standard geschmissen gehören.
-
blob schrieb:
und das mit den friends ist so eine sache für sich. ich bin eh der meinung, dass die dinger aus dem standard geschmissen gehören.
naja, solange eine klasse ihre freunde deklariert und nicht umgekehrt, ist doch alles in ordnung. das erspart einem arbeit, aber verletzt das kapselungs-gebot nicht zwingend, wenn die friend-deklarationen innerhalb einer geschlossenen sinneinheit stattfinden.
(außerdem bist du nur ein unreg, auf dich hört kein standard-kommitee
)
-
Hi!
Ich halte Freundschaften zwischen Klassen/Methoden auch für recht "tricky", aber auch sehr hilfreich teilweise. Also etwas was mit bedacht eingesetzt ruhig im Standard bleiben sollte!

grüße
-
blob schrieb:
wenn mans genau nehmen will, ist der satz "_niemand_ darf von außen auf private membervariablen zugreifen" völlig korrekt, denn eine instanz der klasse greift nicht von _außen_ auf die variable zu

Wobei sich mir dabei die Frage stellt, _warum_ die obige Konstruktion möglich ist. Ist der Hintergrund einfach der, dass man sonst kaum eine Chance hätte, Objekte zu kopieren? Man müsste die Kapselung ja praktisch vollständig aufgeben, da man ja jede (private) Membervariable doch wieder nach außen liefern müsste...
Grüße,
Gnirx
-
Hallo
das ist wohl genau der Grund dafür.
bis bald
akari
-
Wieso wird hier etwas nach aussen geliefert?
Du befindest Dich innerhalb einer Methode der Klasse X. Dort darfst Du auf alle (auch private) Elemente der Klasse X zugreifen. Dass das nur für "this" gilt ist nirgendwo gesagt. Wo ist da für Dich das "von aussen"?
-
Hi!
Richtig, die einzigen "Dinge" die von außen auf private Member einer Klasse zugreifen können sind befreundete Methoden/Klassen.
grüße
-
es wäre ja auch blödsinn, wenn niemand (nichtmal die klasse selber durch ihre eigenen methoden) auf die attribute zugreifen könnte!
Dann hast eine klasse mit attributen, die aber nie geändert, gesetzt oder ähnliches werden könnte....für was würdest due klasse denn dann brauchen??
-
LordJaxom schrieb:
Du befindest Dich innerhalb einer Methode der Klasse X. Dort darfst Du auf alle (auch private) Elemente der Klasse X zugreifen. Dass das nur für "this" gilt ist nirgendwo gesagt. Wo ist da für Dich das "von aussen"?
Danke für die Erklärung - da lag wohl mein Fehler: Ich habe zu sehr an einzelne _Instanzen_ der Klasse X gedacht. Von diesem Standpunkt aus gesehen finde ich es durchaus "überraschend", dass die Instanz instanz1 auf die privaten Member von instanz2 zugreifen darf.
Betrachtet man das ganze aber von deinem "klassenbezogenen" Standpunkt aus, gibt das aber plötzlich irgendwie Sinn.
Viele Grüße,
Gnirx
-
naja, von instanz2 kannst du auf die privaten member von instanz2 zugreifen!
-
ser1al schrieb:
naja, von instanz2 kannst du auf die privaten member von instanz2 zugreifen!
Sagblos!
