Objekt als Rückgabewert, Speichern in Zeiger
-
Hallo NG
Ich schlage mich mal wieder mit dem Problem der Rückgabewerte von Funktionen herum. Ich möchte folgende Funktion aufrufen und deren Ergebnis in einem Zeiger speichern:
XmlContainer XmlManager::openContainer(...)Ich habe dafür eine Varibale
XmlContainer* datacontals privaten Member in der Klasse deklariert und möchte diesem Member das Ergebnis der Funktion zuweisen.
Beidatacont = &(xmlMgr->openContainer(...));meckert der Kompiler "warning: taking address of temporary", und bei
*datacont=xmlMgr->openContainer(...);gibt es einen Speicherzugriffsfehler zur Ausführungszeit.
Also dass Problem mal allgemein ausgedrückt. Wie weise ich einem Zeiger ein Objekt zu, dessen Konstruktor ich nicht selbst aufgerufen habe, sondern der in einer mir fremden Funktion aufgerufen wurde und mir nur das Ergebnis zur Verfügung gestellt wird?
Ich hoffe ich konnte mein Problem ausreichend darstellen.
LG
Timo
-
Drei Mögllichkeiten:
XmlContainer XmlManager::openContainer() { XmlContainer xml; return xml; } XmlContainer* XmlManager::openContainer() { XmlContainer *xml = new XmlContainer; return xml; } typedef std::tr1::shared_ptr<XmlContainer> XmlCont_ptr; XmlCont_ptr XmlManager::openContainer() { XmlCont_ptr xml(new XmlContainer); return xml; }
-
Hi,
EDIT: zu spät, aber gut, greife ich mal Artchis auf:
Artchi schrieb:
Drei Mögllichkeiten:
XmlContainer XmlManager::openContainer() { XmlContainer xml; return xml; }Das hilft nicht wirklich weiter, denke ich.
Mir fallen aber noch ein :XmlContainer* XmlManager::openContainer() { static XmlContainer xml; return &xml; }oder
class XmlManager { XmlContainer intCont; // alternativ als Zeiger, Referenz, .... // ... }; XmlContainer* XmlManager::openContainer() { return &intCont; }Das hier lass ich einfach mal stehen:
Eine Frage, die Du Dir beim Design immer stellen solltest:
woher kommt denn der Speicher, auf den ein Zeiger (hier: datacont) letztlich zeigen soll ?Gruß,
Simon2.
-
Das Problem ist genau das was dein Compiler dir mitteilt: dass du die Adresse einer temporaeren Variablen nimmst, sprich, die variable wird direkt nach der Zuweisung zerstoert und dein Zeiger zeigt ins Niravana. Die temporaere Variable wird immer zerstoert, da kannst du nichts gegen machen, also musst du dir selbst eine Variable anlegen und den Inhalt der temporaeren Variable da reinkopieren (per copy-Konstruktor)
Es gibt zweierlei Moeglichkeiten:- Du benutzt eine normale (automatische) Variable
XmlContainer datacont = xmlMgr->openContainer(...);- Du benutzt wie geplant einen Zeiger (oder vielleicht besser einen Smartpointer) und laesst dir mit new ein entsprechende Objekt auf dem Heap erstellen
XmlContainer* pdcont = new XmlContainer(xmlMgr->openContainer(...));Dann darfst du allerdings nicht vergessen, spaeter delete aufzurufen (es sei denn du nutzt Smartpointer)
In vielen Faellen (zumindest in vielen Faellen, denen man als Anfaenger begegnet) ist die Variante mit dem Zeiger allerdings nicht notwendig.
-
Alles klar. Das mit dem Copy-Constructor hat funktioniert. Danke schön!!!