ungewollter Zugriff auf private member
-
Hallo,
in dem Programm ist der +-Operator überladen, um komplexe Zahlen zu addieren.
class Komplex{ double Re; double Im; public: /* ... */ // Ueberladung der Addition Komplex operator+(const Komplex &z )const{ Komplex sum; sum.Re = this -> Re + z.Re; // Zugriff auf Re-Member vom Objekt sum sum.Im = this -> Im + z.Im; // do. return sum; } };Der Code funktioniert wie gewünscht, doch folgendes verstehe ich nicht,
wieso kann man auf sum.Re zugreifen, Re ist doch als private deklariert?
Ich habe mit C++ und Programmieren noch nicht so viel Erfahrung und bin darum für Antworten sehr dankbar.
Vielen Dank schon jetzt

Aiko
-
bei dir ist die Implementierung des "+ Operators" ein Member der Klasse und somit kann diese auch auf private Member zugreifen.
-
class Komplex{
private: // habe ich hinzu gefügt
double Re;
double Im;public:
meines er achtens müsste da noch ein privat über dem double Re.

aber das von ihm hört sich logischer an

gruß
coco
-
Hallo firefly + CocoEi,
das ging ja schnell.
firefly schrieb:
bei dir ist die Implementierung des "+ Operators" ein Member der Klasse und somit kann diese auch auf private Member zugreifen.
... natürlich jetzt wo du's sagst.
Vielen Dank für die Antworten

Aiko
-
CocoEi schrieb:
meines er achtens müsste da noch ein privat über dem double Re.

cocoDas default scoping von einer class in C++ ist private.
Das default scoping eines structs in C++ ist public.Bei class ist alles, sofern nichts anderes explizit angegeben, private.
-
Mal davon abgesehen...
Aiko schrieb:
class Komplex { double Re; double Im; public: /* ... */ // Ueberladung der Addition Komplex operator+(const Komplex &z ) const { Komplex sum; sum.Re = this -> Re + z.Re; // Zugriff auf Re-Member vom Objekt sum sum.Im = this -> Im + z.Im; // do. return sum; } };...ist das nicht der Weisheit letzter Schluss bzgl Implementierung eines eigenen Komplex-Typs. Erst mal frage ich mich, wie sinnvoll es ist, Re und Im private zu machen. Eine komplexe Zahl besteht nun mal aus Real- und Imaginärteil. Das ist kein "Implementierungsdetail", dass man vor Zugriff schützen müsste, um irgendwelche Invarianten einzuhalten. Dann ist auch bekannt, dass operator+ in so einer Situation als freie Funktion gewisse Vorteile bietet. Zum Beispiel erlaubt mir folgendes
struct komplex { double re, im; komplex(double r=0, double i=0) : re(r), im(i) {} }; inline komplex operator+(komplex const& a, komplex const& b) { return {a.re+b.re, a.im+b.im}; }dann folgende Operationen:
int main() { komplex z {2,3}; auto a = z + z; auto b = z + 3.14; auto c = 2.718 + z; }da sogar die 2.718 durch den impliziten Konstruktor von komplex zu einem komplex-Objekt wird und anschließend operator+(komplex,komplex) aufgerufen werden kann. Das klappt mit operator+ als Elementfunktion nicht, da die linke Seite da schon ein komplex-Objekt sein müsste.