wie greift ein Objekt auf private Datenelemente eines andern Objektes zu?
-
schönen Abend...
bin gerade dabei das Buch "C++ in 21 Tagen" zu lesen.. und am Ende jedes Kapitel kommt ein kleines Quiz mit Frage und Antwort << bin gerade am Ende des Kapitels Klassen
und es erscheint diese Frage.. deren Antwort ich leider nicht verstehen kannFrage:
Wenn ich eine Cat-Klasse mit einem privaten Element itsAge deklariere und dann zwei Cat-Objekte, Frisky und Boots, definiere, kann Boots dann auf die Elementvariable itsAge von Frisky zugreifen?Antwort:
Ja. Private Daten stehen den Elementfunktionen einer Klasse zur Verfügung, und die verschiedenen Instanzen der Klasse können auf ihre jeweiligen Daten zugreifen. In anderen Worten: Wenn Frisky und Boots beides Instanzen von Cat sind, können die Elementfunktionen von Frisky sowohl auf die Daten von Frisky als auf die von Boots zugreifen.War grad noch dabei das Kapitel abzuschließen und war der Überzeugung Klassen ungefähr die Funktion der Klassen verstanden zu haben, aber als ich diese Frage lass wurde ich vom Gegenteil überzeugt
ich versteh einfach nicht wie Frisky auf die privten Daten von Boots zugreifen soll?kann das jemand vielleicht an einem Beispiel erläutern.. den Code einfach erweitern..
#include <iostream.h> class Cat { public: Cat(int x) {itsAge = x;} ~Cat() {cout << "Destruktor\n";} int GetAge() {return itsAge;} private: int itsAge; }; int main() { Cat Frisky(5); cout << Frisky.GetAge() << endl; Cat Boots(7); cout << Boots.GetAge() << endl; cin.get(); return 0; }
mfg insane
-
Man greift ja nicht direkt auf den Wert von itsage zu, sondern über eine public-Methode, das ist verständlich.
Das geht nicht:cout << Frisky.itsage; // Fehler!
Allerdings das schon:
cout << Frisky.GetAge(); // Geht, da die Methode eine offene Schnittstelle hat (public)
Also greift nur die Methode GetAge() auf itsage zu, anders kommst du an diesen Wert nicht ran.
-
Trotzdem kann man zum Beispiel schreiben:
// in class Cat void touchOtherCat() { Cat otherCat(5); otherCat.itsAge = 1337; }
private funktioniert auf Klassen-, nicht auf Instanzbasis.
-
Aja, kann zwar verwirren, geht aber auch, solange die Klassendefinition sowas enthällt.
-
Immer OOP denken, das ist die beste Methode, um das zu verstehen...
Hm, allerdings bin ich selbst gerade am Grübeln, wie man das verstehen kann...
Fällt hier jemandem ein Beispiel ein?Vielleicht so:
Frauen zeigen sich öffentlich nie nackt, das wäre.
Allerdings haben sie keine Probleme sich unter sich auszuziehen, oder auch Brustgrößen zu vergleichen etc.
-
@ Mis2com
deine Erklärung hab ich sofort verstanden
ich hab zuerst gedacht das man über das Object Frisky auf das Object Boots zugreifen könnte >> in der Art >> Frisky.Boots.GetAge();
Immer OOP denken
main() ist die Umkleidekabine der Damen (ihr Gültigkeitsbereich)
dort dürfen sie sich ausziehen........... dann müsste die Umkleidekabine ja die Informationen bekommen.. Frisky kann damit ja nicht umgehen.. außer er hat eine Methode dazu( selbst da nur über den Gültigkeitsbereich)
z.B. Frisky.GetAgeOtherCat(Boots.Getage());
wenn ich noch ne Klasse Dog schreiben würde... und Dog eine Funktion hätte GetAgeOtherCat()
z.B. Dog.GetAgeOtherCat(Boots.Getage());
kann Dog auch auf Cat zugreifen .. solange er mit Cat im selben Gültigkeitsbereich istthx
-
Nein, das ist so völlig falsch.
Wenn du in der Klasse Cat was private hast, können nur Cats drauf zugreifen - auf ihre eigenen Elemente und die von anderen. Das ist auch notwendig, sonst würde folgendes nicht gehen:class Cat { public: void putzen(Cat& andereKatze) { schnurren = true; andereKatze.sauber = true; } private: bool schnurren; bool sauber; }
Ein Dog kann gar nichts mit den private Elementen der Cats machen - das ist ja genau der Schutz. Klasse Hund wird von einem anderen Programmierer programmiert. Und er kann nur das nutzen, was du als public freigibst. Du kannst damit genau festlegen, wie ein Hund mit einer Katze interagieren darf.