000
18.08.2005, 20:47 Uhr
~Christoph
Gast
|
Hallo!
Ich habe ein Vektor-Klasse geschrieben und wollte nun einen Operator überladen, damit man diesen Vektor mit einem Skalar multiplizieren kann:
C++: |
Vector2& Vector2::operator*(float f){ return Vector2(this->x * f, this->y * f); }
|
Der Aufruf schaut so aus:
C++: |
Vector2 myVector1(1, 2); Vector2 myVector2 = (myVector1 * 10.0f);
|
Ich erhalte dabei aber diese Warnung (wobei diese aber auch erzeugt wird wenn ich den Aufruf weglasse): warning C4172: Adresse einer lokalen Variablen oder eines temporären Werts wird zurückgegeben
Dabei sollte doch meiner Meinung nach folgendes passieren: 1. Es wird am Stack eine Instanz von Vector2 angelegt und über den Konstruktor die neuen Werte hineingespeichert. 2. Beim Verlassen der Funktion wird zwar, wie der Linker richtig gemeldet hat, diese Instanz automatisch wieder gelöscht, da sie ja nur am Stack angelegt wurde, jedoch wird für den Rückgabewert über den Copy-Konstruktor eine neue Instanz erzeugt. 3. Die neu erzeugte Instanz für den Rückgabewert wird in der aufrufenden Funktion wieder über den Copy-Konstruktor "myVector2" zugewiesen und danach gelöscht.
Natürlich könnte ich jetzt folgendes schreiben:
C++: |
Vector2& Vector2::operator*(float f){ Vector2* newVec = new Vector2(this->x * f, this->y * f); return *newVec; }
|
(habe ich jetzt nicht ausprobiert, aber müsste funktionieren, da ich wo anders was ähnliches gemacht habe)
Nur daran gefällt mir nicht, dass der neue Vector2 am Heap angelegt wird, weshalb man ihn dann manuell löschen muss? (oder irre ich mich da jetzt?)
Auf was ich hinaus will: Es soll einfach folgendes funktionieren:
C++: |
Vector2 myVector1(1, 2); Vector2 myVector2 = (myVector1 * 10.0f);
|
Dabei will ich danach keinen Vector2 manuell löschen müssen.
Danke schonmal!
mfg |