Frage zu Tempobjekten und Referenzen
-
HI all
Bin seit langem hier im Forum als stiller Leser unterwegs und nun wollte ich euch um Rat bitten:
wenn ich folgendes definiere:
//Matrix5x5 sei ein sehr großes Objekt... Matrix5x5 myCamera::getMatrix5x5() { ... return Matrix5x5(...); } Matrix5x5 operator*(Matrix5x5& lhs , Matrix5x5& rhs ) { ... return Matrix5x5(...); }
erzeuge ich ein Temporäres Objekt....
allerdings wenn ich nun...... aMatrix = aMatrix * myCam.getMatrix5x5();
...erhalte ich eine Fehlermeldung, da man anscheinend keine Referenzen auf Temp-Objecte geben kann.
nahe liegend wäre:
Matrix5x5& function(...){ ... static Matrix5x5 temp =Matrix5x5(..); return temp; }
Ist das jedoch die Permanenteste Lösung?
-
Matrix5x5 operator*(Matrix5x5 const& lhs , Matrix5x5 const& rhs )
-
beides. das cost macht, daß du auch mit temp-kopien arbeiten kannst.
aber function sollte vermutlich auch eine referenz zurückgeben, vielleicht auch eine const-referenz?
-
vielen dank für die antworten
mit 'function' hab ich eigentlich gemeint dass alle functionen ich auf diese weise defenieren sollte..hab mich denke ich falsch ausgedrückt.
wenn ich jedoch eine konstante referenz zurückgebe, heisst das den nicht dass das object unveränderbar ist ? - wenn ja dan sollte 'function' nur eine gewöhnliche referenz zurückgeben...
was meinst du mit beides? meinst du das ich sowohl
Matrix5x5 const& lhs
als auch ...
... static matrix5x5 temp =matrix5x5(..); return temp
zu verwenden habe?
aber wenn ich das tue muss ich dann nicht 'temp' bzw wo anschliesend der inhalt von temp gespeichert wird, nicht danach anschliend selbst destroyen?
will damt das ausdrücken :Matrix5x5 aMatrix = myCam.getMatrix(); ... ~aMatrix;
aber wenn ich nur das tue...
aMatrix = aMatrix * myCam.getMatrix5x5();
verweist das objekt im speicher,ohne die möglichkeit jemals destroyt zu werden... oder etwa nicht?
-
Nein, statische und globale Objekte weden automatisch bei Programmende zerstört.
Diese Funktion legt einmal ein Objekt an und gibt dann immer wieder eine Referenz darauf zurück.
Matrix5x5& myCamera::getMatrix() { static Matrix5x5 temp(..); // besser direkter Konstruktoraufruf return temp; }
Wenn du eine Const-Referenz zurückgeben willst, hast du keine Möglichkeit mehr, das Objekt zu verändern.
const Matrix5x5& myCamera::getMatrix() { static Matrix5x5 temp(..); return temp; }
Aber ich weiss nicht, wieso du
getMatrix()
als Memberfunktion implementierst, besser wäre meiner Ansicht nach eine statische Memberfunktion. Es wird ja nicht auf private Member zugegriffen.
-
vielen dank! denke ich habs jetzt begriffen..
myCamera::getMatrix()
getMatrix habe ich als memberfunktion defeniert weil diese funktion, die matrix in abhängigkeit von den eigenschaften die das jeweilige objekt hat , bildet.
-
Speed schrieb:
in abhängigkeit von den eigenschaften die das jeweilige objekt hat , bildet.
Aha okay.
Aber willst du die Matrix nur einmal erstellen? Denn momentan hat sie statischen Speicherbereich und existiert einmal, und zwar für alle Instanzen. Wahrscheinlich wäre es sinnvoller, wenn du eine Kopie erstellen würdest:
Matrix5x5 myCamera::getMatrix() { return Matrix5x5(...); // Konstruktoraufruf; temporäres Objekt als Kopie zurückgeben }