Frage zu Attributen und Gültigkeit
-
Hallo zusammen,
ich habe eine Frage:
Wenn ich ein Objekt erzeugt:
Pferd pferde[10];(hier wird der geänderte Standardkonstruktor aufgerufen, welcher Defaultwerte setzt)
und anschließend im Objekt pferde[0] die Daten setze:
pferde[0].setDaten("Blacky",0,1);Dann habe ich in der main eine Methode erstellt, die die Daten in eine andere Klasse übergibt: (Klasse Reitstall)
Reitstall stall; stall.irgendwas(pferde[0]);Wenn ich dann hier in der Klasse stall den Namen des Pferdes ändere (ich habe einfach mal die Attribute der Pferde auf public gesetzt. Das ist zwar nicht korrekt, allerdings will ich den Fehler finden) dann auch geändert
void irgendwas (Pferd pferdi) { pferdi.name="BLABLABLA"; cout << pferdi.name <<endl; }== > Als Ausgabe erscheint BLABLABLA
Wenn ich dann nach dem Aufruf der Methode den Namen ausgeben möchte, dann erscheint allerdings wieder der ursprünglich Name:
stall.irgendwas(pferde[0]); cout <<pferde[0].name << endl;Dann erscheint als Ausgabe "Blacky"
Hat jemand eine Ahnung warum das so ist?
Vielen Dank!
Viele Grüße
-
Bei pass-by-value wird eine Kopie des übergebenen Objekts angefertigt. Dieses wird am Ende der Funktion wieder zerstört und das Originalobjekt bekommt davon nichts mit. Wenn du das Originalobjekt verändern willst, sollte der Parameter eine Referenz sein:
void irgendwas (Pferd& pferdi)
-
Hallo,
danke!
Wenn ich das Pferd mit "new" erzeut hätte, müsste ich dann auch
void irgendwas (Pferd& pferdi)
oder geht dann auch
void irgendwas (Pferd pferdi)?
Danke!
-
Ohne Referenz wird das Objekt immer kopiert. Wie es erzeugt wurde, ist nebensächlich.
Ich vermute, du hast eine Java-Vergangenheit, daher:
wenn du in C++Pferd pferd;schreibst, dann erzeugst du damit bereits eine Pferd-Instanz.
In Java ist das nur ein Zeiger auf Pferd und das Pferd selbst wird erst mit new erzeugt. In C++ sähe das z.B. so aus:Pferd* pferd=new Pferd;
Gleiches gilt natürlich, wenn Pferd als Parameter auftaucht: in Java wird da ein Pferd-Zeiger kopiert, in C++ dementsprechend ein Pferd-Objekt.Als dritte Möglichkeit kannst du natürlich auch in C++ einen Zeiger übergeben:
void irgendwas (Pferd* pferdi)
Das macht man normalerweise nur, wenn der Parameter auch null sein darf, was dann von der Funktion auch entsprechend behandelt werden sollte.