referenz auf private objekte
-
Hi, ich bin noch nicht so fit mit der objektorientierung lern das gerade erst alles. Deswegen bin ich derzeit etwas überfragt und wollte mal ganz unverbindlich eine Meinung einholen.
Also folgendes möchte ich realisieren:
Ich möchte in meiner Klasse die eigentlichen daten als private vorhalten, klar um den Zugriff etwas unter kontrolle zu haben.
Ich instaziiere mir also private objekte, die ich mit elemtfunktionen bearbeite, da diese objekte selbst aber zahlreiche methoden haben, die über ihren Zustand informieren, bräuchte ich eine Möglichkeit von außen auf diese objekte bzw. ihre methoden zugreifen zu können.... oder ?
Meine erste und ich gebe zu noch sehr unerfahrener Ansatz war es, das ich eine Konstante Referenz anlegen könnte, die auf diese Objekte zeigt. So würde ich davon ausgehen, hätte ich zumindest read-only zugriff auf diese objekte.
Ihr habt da sicherlich bessere Ideen, wie man das umsetzen könnte und ob das vielleicht sogar ein eher unsinniger Ansatz ist, aber mir fällt irgendwie gerade keine andere Herangehensweise ein.
Wäre gut, wenn ihr mich da aufklären könntet, wie man sowas in der Praxis am gekonntesten regeln kann.
Danke
-
Sagen dir getter/setter etwas? Das wären die Mittel der Wahl.
btw:
Du bräuchtest keine konstante Referenz (sind immer konstant), sondern eine Referenz auf ein konstantes Objekt.
-
Hi, ja getter/setter sagen mir was, wäre eigentlich auch meine erste Wahl gewesen, aber die Frage ist ja ob es sich vermeiden lässt, die getter des objektes für die aktuelle klasse implementieren zu müssen.
Deswegen würde ich für die getter gern direkt das gewünsche objekt referenzieren.
Und mit der Referenz is ok, da hab ich mich falsch ausgedrückt. Dass ich die referenz nicht verändern kann weiß ich. Also in dem Fall bräuchte ich tatsächlich die referenz auf ein konstantes objekt.
Ich bin mir nur nicht ganz sicher, ob ich das richtig verstanden habe. Würde mir diese Referenz als ein temporäres objekt im Speicher abgelegt werden ?
-
ZSchneidi schrieb:
Hi, ja getter/setter sagen mir was, wäre eigentlich auch meine erste Wahl gewesen, aber die Frage ist ja ob es sich vermeiden lässt, die getter des objektes für die aktuelle klasse implementieren zu müssen.
Deswegen würde ich für die getter gern direkt das gewünsche objekt referenzieren.
Und mit der Referenz is ok, da hab ich mich falsch ausgedrückt. Dass ich die referenz nicht verändern kann weiß ich. Also in dem Fall bräuchte ich tatsächlich die referenz auf ein konstantes objekt.
Ich bin mir nur nicht ganz sicher, ob ich das richtig verstanden habe. Würde mir diese Referenz als ein temporäres objekt im Speicher abgelegt werden ?
Einfach den getter konstant machen:
class foo { private: std::string m_bar; public: const std::string& getBar() const { return m_bar; } };Fertig. Das Objekt ist konstant und kann von aussen nicht verändert werden, ausser das böse const_cast.
edit:
Und Referenzen kann man verändern. Dafür sind sie ja da.
Ist mir eben so aufgefallen. Du scheinst das noch nicht ganz verstanden zu haben :D.
Probier mal das hier:int main () { int a = 10; int& my_reference = a; my_reference = 20; std::cout << a << std::endl; }Hoffe damit wirds klarer :).
rya.
-
Hi Scorcher,
danke erstmal für das Beispiel, das sieht doch ganz gut aus.
Werd ich so mal versuchen umzusetzen ^^Zu deinem edit:
Ich müsste wohl noch etwas an meiner Ausdrucksweise feilen..

Du hast das natürlich richtig erklärt. So hab ich es bisher auch
verstanden.
Mit :Dass ich die referenz nicht verändern kann weiß ich.
meine ich natürlich, dass ich der Referenz kein neues Zielobjekt zuweisen kann.
So hatte ich das:
Du bräuchtest keine konstante Referenz (sind immer konstant)
verstanden.
Ich bin wohl grad etwas konfus

-
Scorcher24 schrieb:
edit:
Und Referenzen kann man verändern. Dafür sind sie ja da.
Ist mir eben so aufgefallen. Du scheinst das noch nicht ganz verstanden zu haben :D.Nein, da hast du noch was nicht verstanden.

Du musst schon unterscheiden zwischen Referenzen und dem referenzierten Objekt. Erstere kann man per Definition nicht verändern, zweitere dann nicht, wenn eine Referenz auf
constvorliegt.
-
Nexus schrieb:
Scorcher24 schrieb:
edit:
Und Referenzen kann man verändern. Dafür sind sie ja da.
Ist mir eben so aufgefallen. Du scheinst das noch nicht ganz verstanden zu haben :D.Nein, da hast du noch was nicht verstanden.

Du musst schon unterscheiden zwischen Referenzen und dem referenzierten Objekt. Erstere kann man per Definition nicht verändern, zweitere dann nicht, wenn eine Referenz auf
constvorliegt.Unglücklich ausgedrückt mehr nicht.
-
Is aber auch verwirrend

Wie verhält es sich denn, wenn ich ein nicht konstantes Objekt
über eine konstante referenz ... ja referenziere ?Leider hat Stroustrup sich dazu nicht wirklich ausführlich ausgelassen.
Wird in diesem Fall nun ein temporäres objekt im speicher vorgehalten oder nicht ?
-
int obj; const int& ref = obj; // Über ref kann das Objekt nicht modifiziert werden. // Es gilt aber &obj == &ref, es handelt sich also um das gleiche Objekt.const int& ref = 5; // Ein temporärer RValue (hier das Literal 5) initialisiert ref. Dessen // Lebensdauer wird an die von ref angepasst (bis Scope-Ende).long obj; const int& ref = obj; // Typen sind nicht gleich, es kommt zu einer Umwandlung mit temporärem Objekt. // ref referenziert ein neues Objekt, analog zum zweiten Beispiel.
-
ZSchneidi schrieb:
Wie verhält es sich denn, wenn ich ein nicht konstantes Objekt
über eine konstante referenz ... ja referenziere ?Leider hat Stroustrup sich dazu nicht wirklich ausführlich ausgelassen.
Wird in diesem Fall nun ein temporäres objekt im speicher vorgehalten oder nicht ?
Für was soll ein temporäres Objekt gehalten werden? Die Referenz?
Für eine Referenz muss kein Speicher gebraucht werden. Man kann da quasi die Referenz gleich mit dem Objekt ersetzen ohne jegliche Indirektion (wird dann im Compiler ev. gemacht). Kann aber auch sein, dass eine Referenz über Zeige realisiert ist.
-
int obj; const int& ref = obj; // Über ref kann das Objekt nicht modifiziert werden. // Es gilt aber &obj == &ref, es handelt sich also um das gleiche Objekt.Das wäre das Beispiel das ich meine.
Ich dachte, dass in diesem Fall &ref als temporäres objekt angelegt wird.
Da war ich etwas verwirrt, weil &ref ja auf einen const int verweist, obwohl
obj kein const int ist.
-
ZSchneidi schrieb:
Ich dachte, dass in diesem Fall &ref als temporäres objekt angelegt wird.
Nein, es handelt sich bei
refum eine ganz normale lokale Variable mit entsprechenden Implikationen bezüglich Sichtbarkeit und Lebensdauer.ZSchneidi schrieb:
Da war ich etwas verwirrt, weil &ref ja auf einen const int verweist, obwohl obj kein const int ist.
CV-Qualifizierer (
constundvolatile) kann man immer hinzufügen. Das Gleiche bei Zeigern.
-
Ok, dem bin ich gewillt glauben zu schenken.
Dank dir soweit schonmal.