referenz auf private objekte
-
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.