Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

idontknow

unregistriert

1

25.06.2010, 23:45

Veränderbare Referenzen

Hallohallo :)

Ich stehe vor einem kleinen Problem. In meiner Klasse möchte ich (!!) die Möglichkeit bereit stellen eine Referenz (Member der Klasse) auf eine Variable von außerhalb (Methodenparameter) verweisen zu lassen, aber diesen eben auch zu ändern.

Sprich: Ich will nen Parameter P übergeben, die Membervariable M wird daraufhon zu einer Referenz auf P und wenn ich P verändere bzw die Variable die für P übergeben wurde soll sich M auch ändern da das ja eine Referenz auf P sein soll.

Das Problem ist jetzt dass man Referenzen nicht verändenr kann. Außerdem soll das ganze die Möglichkeit bereit stellen auch "normal" Werte also keine Referenzen zu verwenden.

Eine alternative Mölichkeit wären Pointer aber wenn ich z.b. einen int Speichere und keine "Referenz" sondern das direkte Objekt haben will, müsste ich den mit new erzeugen (wegen dem Pointer) und ich bin mir nicht sicher ob das eine so schöne Lößung ist!!

Hoffe das hat jetzt jemand verstanden :D

mfg

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

26.06.2010, 00:05

Wie du schon erkannt hast kann man Referenzen nicht ändern, bleiben also nur Pointer übrig.

Außerdem soll das ganze die Möglichkeit bereit stellen auch "normal" Werte also keine Referenzen zu verwenden.

Was du damit meinst versteh ich nicht so ganz.

EDIT: Nachdem ichs nochmal gelesen hab bin ich mir nimmer sicher ob ichs überhaupt versteh was du meinst^^
Das Objekt auf das eine Referenz verweist kannst du natürlich schon ändern (wenn es keine Reference to const ist). Auf welches Objekt die Referenz verweist kannst du aber nicht ändern.
Abgesehen davon können Zeiger nicht nur auf Objekte die mit new erzeugt wurden zeigen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (26.06.2010, 00:14)


3

26.06.2010, 00:12

Sprich: Ich will nen Parameter P übergeben, die Membervariable M wird daraufhon zu einer Referenz auf P und wenn ich P verändere bzw die Variable die für P übergeben wurde soll sich M auch ändern da das ja eine Referenz auf P sein soll.
Da M eine Referenz auf P ist, ist M ständig aktuell. Wenn du etwas an P änderst, erfährt M das auch. Erst wenn M nicht mehr auf P sondern auf Q zeigen soll, helfen dir Referenzen nicht mehr weiter.

Eine alternative Mölichkeit wären Pointer aber wenn ich z.b. einen int Speichere und keine "Referenz" sondern das direkte Objekt haben will, müsste ich den mit new erzeugen (wegen dem Pointer) und ich bin mir nicht sicher ob das eine so schöne Lößung ist!!
Warum du das Objekt bei Zeigern mit new erzeugen musst, aber die Referenz auf ein bestehendes Objekt verweisen lassen kannst, leuchtet mir nicht ein. In vielen Fällen, wo man mit Referenzen arbeitet, kann man auch Zeiger nehmen.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

26.06.2010, 00:45

Ich hab das Gefühl du willst dir selbst ins Beim schießen. :D

Wenn du in deiner Klasse einen Zeiger auf ein anderes Objekt hast, dann musst du eh dafür sorgen das es lang genug existiert. Wird das referenzierte Objekt gelöscht, dann wird der Zeiger ungültig und es knallt bei der nächsten Dereferenzierung. Daher wird es meistens eh darauf hinauslaufen das das zu referenzierende Objekt per new auf dem Heap erstellt wird. Als lokale Variable wird es auf dem Stack erstellt und verschwindet sobald der Scope verlassen wird. Wenn man sich sicher ist und doch auf solche Objekte zeigen will, dann holt man sich halt die Adresse.

Vielleicht wäre ein konkretes Beispiel wo du das einsetzen willst hilfreich um zu verstehen was du wirklich haben willst. Es gibt durchaus nen paar Stellen wo das referenzieren von nicht per new erstellen Objekte einigermaßen problemlos möglich ist.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

26.06.2010, 09:30

nochmal um das klar zu stellen: eine referenz ist eine einfache variante(von der syntax her) des zeigers.
primitive datentypen kannst du ruhig als normalen wert übergeben die sind meistens sogar kleiner als zeiger die darauf verweisen.
mit dem adressoperator-& kommst du an die adresse eines objekts, dass auf dem stack erstellt wurde.

C-/C++-Quelltext

1
2
int foo = 0;
int *bar = &foo;
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

idontknow

unregistriert

6

26.06.2010, 10:12

Ich weiß was Referenzen/Zeiger sind ;).

Was jetzt vermutlich nicht ganz rüberkam:

Im Endeffekt will ich 2 Möglichkeiten bereit stellen. Die erste wäre das mit den Referenzen/Pointer, dass ich das Objekt außerhalb ändere und es in meiner Klasse auch den geänderten Wert annimmt. Aber die Klasse soll auch in der Lage sein nicht nur eine Referenz auf etwas zu erzeugen sondern ebene auch ein "eigenes" Objekt, sprich ne ganz normale Variable.

In Code ausgedrückt etwa so:

C-/C++-Quelltext

1
2
3
4
5
6
7
class foo
{
int *bar;
public:
void setRef(int *i) {bar = i;}
void set(int i){if(!bar) bar = new int; *bar = i;}
};


Vllt kamms jetzt verständlicher rüber (hofentlich)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

26.06.2010, 10:56

du hast die lösung doch schon. du solltest dafür shared_ptr benutzen.
was das ganze bringen soll ist ne andere sache...
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

26.06.2010, 11:53

Ich sehe das so, wie NachoMan. Man kann das technisch mit einem smart Pointer lösen, aber gut finde ich es auch nicht unbedingt. Bessere Lösungen gibt es wahrscheinlich, wenn du den genauen Zweck erläuterst.

idontknow

unregistriert

9

26.06.2010, 12:18

hmm prinzipiell it es nicht unbedingt nötig.

Will einfach eine Kamera haben die einem Vektor folgt (Parameter: At). Aber es ist natürlich nicht zwingend dass sie dem immer folgt daher eben auch die Möglichkeit keine Referenz zu benutzen.

Im Prinzip muss ich ehh immer Camera.compute() aufrufen theoretisch könnte ich da dann auch den neuen At Vektorimmer setzen ist vllt sogar die beste Lößung!

10

26.06.2010, 12:53

Der Vektor, dem die Kamera folgen soll... Ist der nicht Bestandteil einer anderen Klasse (z.B. eines Spielers)? In dem Falle würdest eine Referenz auf Implementierungsdetails speichern, was von der Kapselung her nicht unbedingt angebracht ist.

Ich würde auch eher den Vektor jedes Mal an eine Kamera-Methode übergeben, oder die Kamera-Klasse ihn jeweils abfragen lassen. Welche Möglichkeit du wählst, hängt davon ab, wie deine Abhängigkeiten im Projekt aussehen.

Werbeanzeige