private
-
class Test { public: void memberFunction(Test& t) { // Warum ist hier der Zugriff auf die Variable i // möglich, obwohl sie private ist? t.i = 0; } private: int i; };
-
privateer schrieb:
class Test { public: void memberFunction(Test& t) { // Warum ist hier der Zugriff auf die Variable i // möglich, obwohl sie private ist? t.i = 0; } private: int i; };
das ist halt so.
private schützt nur gegen die ganzen funktionen außerhalb der eigenen klasse. gegen die eigenen brüder gibt es keinen schutz.
-
// Warum ist hier der Zugriff auf die Variable i
Weil private in C++ auf Klassenebene und nicht auf Objektebene funktioniert. Das heißt innerhalb der Methoden einer Klasse X kannst du auf die private-Elemente aller Objekte von X zugreifen.
class Test { int i; public: void f(Test& p); }; Test global; void Test::f(Test& p) { i = 2; // mein i p.i = 2; global.i = 2; }
-
Folgendes wäre für den Compiler auch etwas schwer nachzuvollziehen (wenn es nicht so wäre, wie es ist):
class foo { public: void baz (foo *f) { f->baz(); } private: void bar () { cout << "private!\n"; } }; int main () { foo f; f.baz(&f); }
Etwas Dynamik dazu und schon kennt sich keiner mehr aus und niemand weiß, wer jetzt Zugriff hat, wenn man nicht neue Regeln einführen und noch restriktiver sein will.
-
Ich denke du meinst:
class foo { public: void baz (foo *f) { f->bar(); // nicht f->baz() } private: void bar () { cout << "private!\n"; } };
-
privateer schrieb:
class Test { public: void memberFunction(const Test& t) { //ändern durch const nicht mehr möglich... t.i = 0; } private: int i; };
Währe auch ein Ansatz.
Devil