Cuchulainn am 08.07.2008 um 10:30 Uhr
Ich habe eine Klasse ClassA mit einer Methode method1 und es gibt eine Klasse ClassB. Die Methode method1 soll ein Objekt von ClassB erzeugen und zurückgeben. So zum Beispiel:
ClassB& ClassA::method1() { ClassB classBObject;
// tut etwas
return classBObject; }
Wenn ich das so programmiere, erhalte ich eine Warnung, dass ich eine Referenz auf eine lokale Variable zurückgebe, was wohl auch stimmt. Welche Möglichkeiten gibt es, dieses Problem zu lösen?
Das Objekt nicht auf dem Stack, sondern auf dem Heap anlegen (mit new)
Hi,
z.B.
ClassB ClassA::method1() { .... } Klasse B nicht als Referenz sondern als Kopie zurückgeben
oder
Klasse B statisch deklarieren (Vorsicht: dann gibt es nur eine Instanz von B für alle Instanzen der Klasse A
oder B Global deklarieren
oder B mit new dynamisch anlegen
oder
...
Du solltest das Objekt mit dem Schlüsselwort "new" anlegen und dann die Referenz dieses Objektes (Adresse im Heap-Speicher) zurückgeben.
AClass *aPointer = new AClass; ...
(Das Objekt statisch zu deklarieren bzw. global war ja nicht das Ziel... wäre aber eine Möglichkeit.)
Die Frage liest sich ein wenig wie eine Übungsaufgabe. Wenn es hier noch Fragen und Probleme gibt, solltest Du Dir das fehlende Wissen mit Kommilitionen erarbeiten bzw. auf den Dozenten zugehen - denn hierbei handelt es sich um Grundlagenwissen!
PS Ein mit new alloziertes Objekt muss später mit "delete" wieder freigeben werden: delete aPointer;
Eine Quelle zum Nachlesen: http://www.scs.stanford.edu/~dm/home/papers/c++-new.html
Hi,
woraus schießt Du das Ziel, daß das Objekt nicht auch statisch oder global deklariert werden kann ?
Bei einfachem new mit anschliessedem Übergang der memory ownership hat man das Problem, daß der Aufrufer das Objekt deleten muss. Falls Du den Source nicht kennst, muß der Anwender in der Doku lesen, daß evtl. die aufrufende Instanz den delete vornehmen muß. Daher wird dieses Konstrukt (wegen der hohen Wahrscheinlichkeit, daß es eben überlesen wird), selten benutzt, jedenfalls im konventionellen C++ (Std. Unmanaged C++ hat keine besondere Garbage Collection).
Das Problem der Memory Ownership ist nicht trivial und daher gibt es verschiedene Lösungsansätze (wie z.B. der Smart oder auto pointer, siehe auch www.cdc.informatik.tu-darmstadt.de/lehre/SS05/seminar/C++/FuhrmannSmartPtr.pdf oder www.ica1.uni-stuttgart.de/Coursesand_Lectures/C++/script/node32.html).
Bei reiner Assoziation (z.B. global oder in einem namespace), wird hingegen die Instanz automatisch beim Programmende freigegeben bzw. verwaltet sich selbst (evtl. reicht das für den gegebenen Fall).
Eine Übergabe als Kopie halte ich bei nicht zeit- oder speicherkritischen Anwendungen aber noch für die eleganteste Lösung, es benötigt aber u.U. einen spezifischen Copy-Konstruktor.
Für den jeweiligen Zweck sollte in jedem Fall die optimale Möglichkeit ausgewählt werden. Eine pauschale Aussage kann nicht getroffen werden.